关于列表:Python变量赋值

Python Variable Assignment

本问题已经有最佳答案,请猛点这里访问。

有人能解释一下为什么在python中会发生这种情况吗?

1
2
3
4
5
6
7
8
9
10
11
>>> a = [1, 2, 3]
>>> b = a
>>> b[0] = 2
>>> print a
[2, 2, 3]
>>> a[0] = 4
>>> print b
[4, 2, 3]
>>> b = [111]
>>> print a
[4, 2, 3]

基本上,为什么我可以重新分配A或B中的元素并更改另一个,但如果我完全修改了列表,就不能更改另一个?谢谢您!


当使用a指定b时,两个对象现在都指向相同的内存位置。所以在任何一个对象中所做的任何更改都将反映在另一个对象中。当用新值分配"b"时,对象内存地址将变为不同的。详述:

1
2
3
4
5
6
7
8
9
10
11
12
>>> a=[1,2,3]
>>> b=a
>>> id(a)
4520124856
>>> id(b)
4520124856
>>> b=[111]
>>> id(a)
4520124856
>>> id(b)
4520173936
>>>

id()用于获取对象的内存地址。

如果要在不具有相同内存位置的情况下创建"a"的精确副本,请使用b=a[:]仅创建数据的副本。


当我们定义变量b=a python时,将这个值保存在内存位置x中。点A和点B都是X内存位置。所以我们改变了B的值,A的值也改变了。我们将新值赋给b,使其存储在另一个内存位置,b指向新的内存位置。所以a的值保持不变。


这是因为当您执行b = [111]操作时,您将为b分配一个全新的列表对象。因此,b现在包含对新列表的引用,而不再包含对旧列表的引用。