python byRef//copy
我对Python不熟悉(而且对编程也不太了解),但我记得在阅读时,Python通常不会复制值,所以任何语句a=b都会将b指向a。如果我跑python byRef//copy,python,Python,我对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 obj
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
当处理可变对象(如列表
)时,这一整体区别确实非常重要,而不是像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中有关赋值的规则:
只需一个小小的变化,你就能看到你所期待的。这两个变量确实开始指向同一个对象,如果该对象是可变的,您可以同时在两个位置看到变化
>>> a = [1]
>>> b = a
>>> a[0] = 2
>>> print b
[2]
您对示例所做的是更改a
,使其不再引用对象1
,而是引用对象2
。剩下的b
仍然是指1
@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=2,我会把a指向的任何东西从1改为2,但是从你说的,我似乎改变了a指向的位置(从1改为2)@user1266138——是的。这是一种恰当的思考方式。(虽然在python中我们通常说“reference”而不是“point”,但这实际上只是语义)。