列表可以改变吗? [复制]

2024-02-10

当我输入以下代码时,

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 个内存地址?


您创建了一个新列表对象并将其绑定到相同的名称,x。您从未改变绑定到的现有列表对象x在开始时。

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

如果你想mutate一个列表,调用该对象的方法:

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

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

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

Demo:

>>> 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 名称和绑定的精彩演讲可以有所帮助:关于 Python 名称和值的事实和神话 http://nedbatchelder.com/text/names.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列表可以改变吗? [复制] 的相关文章

随机推荐