我有这个片段:
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
的可变性方面发挥作用?
答案 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]