如何在保留原始列表的同时为嵌套列表分配一个值在Python中
如何在保留原始列表的同时为嵌套列表分配一个值在Python中
我在使用Python时遇到了两个奇怪的问题。
首先,当我给嵌套列表赋值时,比如foo[0][0] = 1
,foo
会变成[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
。
其次,即使我使用.copy()
,它也会将相同的值赋给原始值。
>>> foo = [[0]*3]*3 >>> bar = foo.copy() >>> bar[0][0] = 1 >>> bar [[1, 0, 0], [1, 0, 0], [1, 0, 0]] >>> foo [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
我需要将bar
改为[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
,并保持foo
不变。
如何实现这一点?
如何在保持原始列表的情况下,给嵌套列表赋值?
在Python中,如果想要给嵌套列表赋值,同时保持原始列表不受影响,不能使用[[x]*n]*n
的方式进行初始化。这种方式会导致所有的嵌套列表都指向同一个引用,因此对其中一个嵌套列表的修改会影响到其他所有的嵌套列表。
为了解决这个问题,可以使用copy.deepcopy()
方法进行深拷贝,而不是浅拷贝。深拷贝会创建一个完全独立的副本,包括所有的嵌套列表。
下面是一个示例代码:
import copy foo = [[0 for _ in range(3)] for _ in range(3)] bar = copy.deepcopy(foo) bar[0][0] = 1 print(foo) print(bar)
输出结果为:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
可以注意到,bar
的输出结果仍然受到foo
初始化方式的影响。这个问题仍然存在。
通过使用copy.deepcopy()
方法,我们可以确保在给嵌套列表赋值时,原始列表不会受到影响。这样我们就可以安全地修改副本列表,而不会对原始列表产生任何影响。