理解Python中的可变性

时间:2013-05-24 09:13:02

标签: python mutability

我有这个片段:

a = [1,2,3]
b = a
b = [4,5,6] # a doesnt change

和此:

a = [1,2,3]
b = a
b[0] = 5 # a also changes

b的初始化如何在决定a的可变性方面发挥作用?

1 个答案:

答案 0 :(得分:3)

创建列表并将其分配给变量时,例如

a = [1, 2, 3]

您创建一个对象,变量a包含对该对象的引用。当你这样做

b = a

您在b中分配了相同的引用,因此现在a和b都指向您的列表。所以当你执行

b[0] = 5

你改变了同样的名单。

您可以使用id()函数查看此操作,该函数返回对象的内存地址:

>>> a = [1, 2, 3]
>>> b = a
>>> id(a), id(b)
(140454191340720, 140454191340720)

他们是完全相同的。关键是,a和b本身不是列表,它们指向列表。

当您执行以下操作时:

a = [1, 2, 3]
b = a
b = [2, 3, 4]

您首先指定了b指向指向的列表的引用,但随后您为其指定了新引用。

顺便说一句,当你按照

的方式做某事时,这可能会让你陷入困境
def foo (a=[]):
    a.append(42)
    return a

因为参数a在每次调用时都指向同一个列表,如果你在没有参数的情况下调用这个函数5次,那么列表将包含5x 42:

foo(); foo(); foo(); foo();
print(foo())
>>> [42, 42, 42, 42]