python如何根据另一个列表声明一个列表,但使其不';你不指对方吗? 例如考虑以下内容: a = [1,5,3,4] b = a a += [6]

python如何根据另一个列表声明一个列表,但使其不';你不指对方吗? 例如考虑以下内容: a = [1,5,3,4] b = a a += [6],python,list,Python,List,在我将6附加到列表a之后,它也将它附加到列表b,因为它们相互引用(如果我写的是b+=[6],则会产生相同的结果)。我需要的是将列表b初始化为与列表a相同,但不使其引用列表a 谢谢大家! 您正在进行所谓的浅拷贝。你想做一个深度复制 下面是一篇关于python中浅韵文深度复制的文章: 使用: a = [1,5,3,4] b = a[:] # <- this is where you need to add ':' a += [6] 或: 您可以使用以下方法制作列表的副本: b = list

在我将6附加到列表a之后,它也将它附加到列表b,因为它们相互引用(如果我写的是b+=[6],则会产生相同的结果)。我需要的是将列表b初始化为与列表a相同,但不使其引用列表a


谢谢大家!

您正在进行所谓的浅拷贝。你想做一个深度复制

下面是一篇关于python中浅韵文深度复制的文章: 使用:

a = [1,5,3,4]
b = a[:] # <- this is where you need to add ':'
a += [6]
或:


您可以使用以下方法制作列表的副本:

b = list(a)

这是一个确切的解释发生了什么,为什么你有时需要深度复制。在python中,某些类型的变量(如列表)的存储方式略有不同。当您将a分配给
[1,5,3,4]
时,您实际做的是将a分配给指针(告诉您该列表的位置)。当你说
b=a
时,你将b分配给a-这是一个指针。它们现在都是同一个指针,指向同一个地方。因此,当你改变一个,另一个也会改变

现在是解决方案。建议的解决方案有3种

import copy
b = copy.deepcopy(a)
b = a[:]
b = list(a)
第一个,做深度复制,总是有效的,但当然它比另外两个更努力

第二种方法之所以有效,是因为
a[:]
说“给我一个包含a中所有元素的列表”(参见python中的列表/字符串切片),所以它获取a中的每个项目,并将其放入b中。第三种方法的工作原理与第二种完全相同。但是,它们在处理多个维度时存在问题

>>> a = [[1]]
>>> b=list(a)  # or a[:], they do the same thing
>>> a[0].append(1)
>>> a.append(2)
>>> b
[[1, 1]]
>>> a
[[1, 1], 2]

这里的问题是a是指向列表的指针,而该列表中的第一项是指向第二个列表的指针。使用这种方法,我们复制列表中的所有项目(指向第二个列表的指针),因此我们实际上没有自己的第二个列表-它与一个列表的指针相同。这就是deep copy为您所做的。

请解释您的否决票。请记住,虽然解决方案
b=a[:]
适用于单维度列表,但对于多维度,您需要一个deep copy,这是最好的选择
import copy
b = copy.deepcopy(a)
b = a[:]
b = list(a)
>>> a = [[1]]
>>> b=list(a)  # or a[:], they do the same thing
>>> a[0].append(1)
>>> a.append(2)
>>> b
[[1, 1]]
>>> a
[[1, 1], 2]