python - Python 列表是可变的吗?

标签 python list mutable

当我输入以下代码时,

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

最佳答案

您创建了 新列表对象 并将其绑定(bind)到同名 x .您从未改变绑定(bind)到 x 的现有列表对象。在开始时。

Python 中的名称只是引用。赋值是将名称绑定(bind)到对象。当您分配给 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 名称和绑定(bind)的精彩演示会有所帮助:Facts and myths about Python names and values .

关于python - Python 列表是可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292174/

相关文章:

python - 如何从 txt 文件中的拆分行制作嵌套列表?

python - 无论元组顺序如何,在两个元组列表中查找交集

ruby - Ruby 中的字符串是可变的吗?

python - 为什么 ruby​​ 和 python 数学计算不同

python - 如何量化优化的 tflite 模型的输入和输出

python - 使用列表理解将字符串中的多个重音字母替换为一个字母

Python - 使用列表创建新变量

python - 如何检查不变性

java - 这两个Java代码Snaps有什么区别吗?

python - 如何将 AWS 的 Dynamo Db 与 Django 结合使用?