如何在保留原始列表的同时为嵌套列表分配一个值在Python中

14 浏览
0 Comments

如何在保留原始列表的同时为嵌套列表分配一个值在Python中

我在使用Python时遇到了两个奇怪的问题。

首先,当我给嵌套列表赋值时,比如foo[0][0] = 1foo会变成[[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不变。

如何实现这一点?

0
0 Comments

如何在保持原始列表的情况下,给嵌套列表赋值?

在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()方法,我们可以确保在给嵌套列表赋值时,原始列表不会受到影响。这样我们就可以安全地修改副本列表,而不会对原始列表产生任何影响。

0