1

我有这个片段:

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

4

1 回答 1

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]

您首先为 ba 分配了对 a 指向的列表的引用,但随后为它分配了一个新的引用。

顺便说一句,当您执行以下操作时,这可能会咬到您

def foo (a=[]):
    a.append(42)
    return a

由于参数 a 在每次调用时都指向同一个列表,如果您在没有参数的情况下调用此函数 5 次,则该列表将包含 5x 42:

foo(); foo(); foo(); foo();
print(foo())
>>> [42, 42, 42, 42]
于 2013-05-24T09:37:45.750 回答