我有这个片段:
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
?
我有这个片段:
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
?
当您创建列表并将其分配给变量时,例如
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]