为什么会这样:
>>> 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]
我的意思是,为什么变量真的被复制而迭代器只被引用?
答案 0 :(得分:6)
变量不是“真正复制”的。变量是对象的名称,赋值运算符将名称绑定到运算符右侧的对象。更详细地说:
>>> a = 1
表示“将a
命名为对象1
”。
>>> b = a
表示“使b
成为引用a
当前引用的对象的名称。1
。
>>> a = 2
表示“将a
命名为对象2
”。这对于引用1
现在引用的任何其他对象,例如b
没有影响。
在第二个示例中,a
和b
都是引用相同列表对象的名称。 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)
如果您已将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]