6

我是 Python 新手(而且对编程不太了解),但我记得读过 Python 通常不会复制值,因此任何语句 a = b 都会使 b 指向 a。如果我跑

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

给出结果 1。那不应该是 2 吗?

4

4 回答 4

11

不,结果应该是 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,这整个区别确实是最重要的。floattuple

现在考虑以下代码:

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.
于 2012-07-27T14:52:23.333 回答
3

当您执行b = a时,它使 b 引用相同的值 a 引用。然后,当您执行时a = 2,它会引用一个新值。b 不受影响。

Python中的赋值规则:

  1. 赋值只是使名称引用值。

  2. 对名称的赋值永远不会影响引用旧值的其他名称。

  3. 数据永远不会被隐式复制。

于 2012-07-27T14:54:12.927 回答
2

@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.
于 2012-07-27T14:58:30.697 回答
0

只需进行一点小改动,您就可以看到您所期待的结果。这两个变量确实开始指向同一个对象,如果该对象是可变的,您可以同时看到两个位置的变化。

>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]

您对示例所做的更改a是使其不再引用 object1而是引用 object 2。那左边b仍然指的是1.

于 2012-07-27T14:56:32.050 回答