列表可以改变吗?

新手上路,请多包涵

当我输入以下代码时,

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

原文由 amandi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 224
1 个回答

您创建了一个 新的列表对象 并将其绑定到相同的名称 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 名称和绑定的精彩演讲可以提供帮助: 关于 Python 名称和值的事实和神话

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏