python byRef//copy

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

我对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
当处理可变对象(如
列表
)时,这一整体区别确实非常重要,而不是像
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”,但这实际上只是语义)。