在Python中复制嵌套列表

在Python中复制嵌套列表,python,list,copy,deep-copy,Python,List,Copy,Deep Copy,我想复制一个二维列表,这样如果我修改一个列表,另一个列表就不会被修改 对于一维列表,我只需执行以下操作: a = [1, 2] b = a[:] 现在如果我修改b,a不会被修改 但这不适用于二维列表: a = [[1, 2],[3, 4]] b = a[:] 如果我修改b,a也会被修改 如何解决此问题?要获得更通用的解决方案,无论维度的数量如何,都可以使用copy.deepcopy(): b = [x[:] for x in a] +1.自适当时起。我个人喜欢避免使用copy/deepco

我想复制一个二维列表,这样如果我修改一个列表,另一个列表就不会被修改

对于一维列表,我只需执行以下操作:

a = [1, 2]
b = a[:]
现在如果我修改
b
a
不会被修改

但这不适用于二维列表:

a = [[1, 2],[3, 4]]
b = a[:]
如果我修改
b
a
也会被修改


如何解决此问题?

要获得更通用的解决方案,无论维度的数量如何,都可以使用
copy.deepcopy()

b = [x[:] for x in a]

+1.自适当时起。我个人喜欢避免使用copy/deepcopy(在现实生活中很少有有效的用例;对于一个超过2维的列表也是如此),你能提供一个用例吗?我试图复制一个2D列表,但我不确定用您提供的变量名替换什么。@johnlock
b
是新列表,
a
是旧列表
x
是内部使用的。对我来说,
path
是一个2D数组,我想复制
path[I]
所以我做了
curr\u level=[x[:]for x in path[I]]
这就是我所说的高效(和聪明)编程!(导入额外的模块来做一些简单的事情是没有效率的。)@Dav,你的观点是正确的。我更喜欢总是导入模块,以避免名称冲突,而不是逐个处理函数。:)请注意,这也将深度复制列表中的实际元素。@Dav,我不同意,通常最好使用module.function()格式。“名称空间是一个非常好的主意,让我们做更多的事情吧!”@FogleBird:然而,PEP-8实际上似乎暗示了来自。。。导入…是标准,除非存在名称空间冲突:(请参阅“导入”)。很多时候,当人们使用嵌套列表并需要以这种方式复制它们时,他们确实希望使用
numpy
。嗯,这只是语言中的一个缺陷。在两种情况下行为是不同的,在这两种情况下,行为应该是相同的——典型的解释语言。如果你有大的代码,很难理解debug@SerhiiPoklonskyi不,这不是虫子。当您执行
b=a[:]
时,您将创建一个新列表
b
,因此例如
a.append([5,6])
不会修改
b
,因为它只会更改
a
。但是,行
a[1][0]=5
将更改
b
,因为它更改了
b
引用的列表。@ArtemisFowl不适用于我(a[1][0]也不修改b)。即使会,我也不明白这有什么关系。问题是:当您执行
a=b.copy()
时,
a
在内存中成为一个单独的位置:既不是指向
b
的引用,也不是指向
b的指针,即它是一个自变量。但是,如果执行
a=b.copy()
并且
b
是一个数组,则该操作不起作用。对此有什么合乎逻辑的解释?如果
b
是一个数组,
a=b.copy()
必须创建一个自变量。否则它就是一个bug。p、 我无意粗鲁,如果我是,请向我解释wrong@SerhiiPoklonskyi我认为您感到困惑的原因是您没有理解Python。Python实际上没有“二维数组”,它只有列表,可以包含其他列表。我将尝试通过一个例子来演示:您使用
a=[[1,2],[3,4]]
定义
a
。然后创建
a
b=a.copy
的副本。这是一个不同的列表,但它包含相同的“子列表”。这意味着更改
b
,例如
b.append([5,6])
不会更改
a
,但是更改
b
中的列表,例如
b[0]。append(3)
也会更改
a
的第一个列表。
import copy
b = copy.deepcopy(a)