Python列表是否可变?

问题描述 投票:2回答:3

当我输入以下代码时,

x=[1,2,4]
print(x)
print("x",id(x))
x=[2,5,3]
print(x)
print("x",id(x))

它给出了输出

[1, 2, 4]
x 47606160
[2, 5, 3]
x 47578768

如果列表是可变的,那么为什么在更改列表x时它会给出2个内存地址?

python list mutable
3个回答
14
投票

您没有使用以下行改变(更改)x引用的列表对象:

x=[2,5,3]

相反,该行创建一个新的列表对象,然后将变量x重新分配给它。所以,x现在引用了新对象,id(x)给出了与以前不同的数字:

>>> x=[1,2,4]  # x references the list object [1,2,4]
>>> x
[1, 2, 4]
>>> x=[2,5,3]  # x now references an entirely new list object [2,5,3]
>>> x
[2, 5, 3]
>>>

13
投票

您创建了一个新的列表对象并将其绑定到相同的名称x。你从来没有突然改变绑定到x的现有列表对象。

Python中的名称只是引用。赋值是将名称绑定到对象。再次分配给x时,您将该引用指向另一个对象。在您的代码中,您只需创建一个全新的列表对象,然后将x反弹到该新对象。

如果要改变列表,请调用该对象上的方法:

x.append(2)
x.extend([2, 3, 5])

或分配给列表的索引或切片:

x[2] = 42
x[:3] = [5, 6, 7]

演示:

>>> x = [1, 2, 3]
>>> id(x)
4301563088
>>> x
[1, 2, 3]
>>> x[:2] = [42, 81]
>>> x
[42, 81, 3]
>>> id(x)
4301563088

我们更改了列表对象(变异了),但该列表对象的id()没有改变。它仍然是相同的列表对象。

也许Ned Batchelder对Python名称和绑定的出色表现可以帮助:Facts and myths about Python names and values


4
投票

您没有改变列表,您正在创建一个新列表并将其分配给名称x。这就是id为您提供不同输出的原因。你的第一个列表已经消失,将被垃圾收集(除非在某处有另一个引用)。

© www.soinside.com 2019 - 2024. All rights reserved.