当我将一个列表分配给另一个列表时,我看到在更改一个列表中的一个元素时,另一个元素会自动分配该值。
这种行为的原因是什么?
>>> a = [1,2,3] # create a list
>>> b = a
>>> b
[1, 2, 3]
>>> id(a)
40307408
>>> id(b)
40307408
>>> a[2] = 5
>>> b
[1, 2, 5]
>>> b[1] = 10
>>> a
[1, 10, 5]
当我将一个列表分配给另一个列表时,我看到在更改一个列表中的一个元素时,另一个元素会自动分配该值。
这种行为的原因是什么?
>>> a = [1,2,3] # create a list
>>> b = a
>>> b
[1, 2, 3]
>>> id(a)
40307408
>>> id(b)
40307408
>>> a[2] = 5
>>> b
[1, 2, 5]
>>> b[1] = 10
>>> a
[1, 10, 5]
因为对象a
和b
引用相同的对象(正如您通过检查两个对象所观察到id
的)。如果你改变一个值,另一个也会改变。就像b
是 的克隆a
,但将继续成为克隆。
为避免这种行为,您可以执行以下操作:
b = a[:]
它分配b
了a
.
或者:
b = list(a)
或者:
import copy
b = copy.copy(a) # The copy module can be useful for nested lists.
通过调用b = a
,您实际上只是为同一个对象分配了另一个名称,如id(a)
和id(b)
显示。如果要将 a 复制到 b,则应使用b = a[:]
或b = list(a)
。在这种情况下,a 和 b 将具有不同的生命周期。尝试调用 id() 并检查。