Python中的变量复制如何正常工作?

时间:2015-11-12 23:00:23

标签: python variables reference

为什么会这样:

 >>> a = 1
 >>> b = a
 >>> a = 2
 >>> print(a)
 2
 >>> print(b)
 1

...但:

 >>> a = [3, 2, 1]
 >>> b = a
 >>> a.sort()
 >>> print(b)
 [1, 2, 3]

我的意思是,为什么变量真的被复制而迭代器只被引用?

3 个答案:

答案 0 :(得分:6)

变量不是“真正复制”的。变量是对象的名称,赋值运算符将名称绑定到运算符右侧的对象。更详细地说:

>>> a = 1表示“将a命名为对象1”。

>>> b = a表示“使b成为引用a当前引用的对象的名称。1

>>> a = 2表示“将a命名为对象2”。这对于引用1现在引用的任何其他对象,例如b没有影响。

在第二个示例中,ab都是引用相同列表对象的名称。 a.sort()使该对象发生变异,并且因为两个变量都引用同一个对象,所以在两个名称下都可以看到变异的效果。

答案 1 :(得分:2)

将赋值变量视为指向保存值的内存位置的指针。您实际上可以使用id获取内存位置。

a = 1
b = a

>>> id(a)
4298171608

>>> id(b)
4298171608  # points to the same memory location

a = 2
>>> id(a)
4298171584  # memory location has changed

对列表示例执行相同的操作,您可以看到两者实际上都在同一个对象上运行,但是不同的变量都指向同一个内存位置。

a = [3, 2, 1]
b = a
a.sort()

>>> id(a)
4774033312

>>> id(b)
4774033312  # Same object

答案 2 :(得分:0)

在您的第一个示例中,您在制作了b的值a之后重新分配了一个值。所以a和b带有不同的值。

如果您已将a重新分配给新的排序列表而不是仅仅将其排序,那么您的第二个示例中也会出现同样的情况。

a = [3,2,1]
b = a
a.sort()
print b
[1,2,3]

但是...

a = [3,2,1]
b = a
sorted(a)
print b
[3,2,1]