我是 Python 新手(而且对编程不太了解),但我记得读过 Python 通常不会复制值,因此任何语句 a = b 都会使 b 指向 a。如果我跑
a = 1
b = a
a = 2
print(b)
给出结果 1。那不应该是 2 吗?
我是 Python 新手(而且对编程不太了解),但我记得读过 Python 通常不会复制值,因此任何语句 a = b 都会使 b 指向 a。如果我跑
a = 1
b = a
a = 2
print(b)
给出结果 1。那不应该是 2 吗?
不,结果应该是 1。
将赋值运算符 ( =
) 视为对引用的赋值。
a = 1 #a references the integer object 1
b = a #b and a reference the same object
a = 2 #a now references a new object (2)
print b # prints 1 because you changed what a references, not b
在处理可变对象(例如 和 等不可lists
变对象)时int
,这整个区别确实是最重要的。float
tuple
现在考虑以下代码:
a=[] #a references a mutable object
b=a #b references the same mutable object
b.append(1) #change b a little bit
print a # [1] -- because a and b still reference the same object
# which was changed via b.
当您执行b = a
时,它使 b 引用相同的值 a 引用。然后,当您执行时a = 2
,它会引用一个新值。b 不受影响。
Python中的赋值规则:
赋值只是使名称引用值。
对名称的赋值永远不会影响引用旧值的其他名称。
数据永远不会被隐式复制。
@mgilson 有一个很好的答案,但我发现它有点难以掌握。我提出这个答案是为了尝试以不同的方式解释它。
a = 1 # This makes a point to a location in memory where the Integer(1) is located
b = a # This makes b point to the same place.
a = 2 # This makes a point to a different location in memory where Integer(2) is located
print(b) # b still points to the place where Integer(1) was stored, so it prints out 1.
只需进行一点小改动,您就可以看到您所期待的结果。这两个变量确实开始指向同一个对象,如果该对象是可变的,您可以同时看到两个位置的变化。
>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]
您对示例所做的更改a
是使其不再引用 object1
而是引用 object 2
。那左边b
仍然指的是1
.