例如考虑以下几点:Python。如何根据另一个列表声明一个列表,但是使它们不相互引用?
a = [1,5,3,4]
b = a
a += [6]
我追加6后列出,还追加它B名单,因为他们称对方(如果我已经写了B + = [6],而不是,它会产生相同的结果)。我需要的是将列表b初始化为与列表a相同,但不会引用列表a。
谢谢!
例如考虑以下几点:Python。如何根据另一个列表声明一个列表,但是使它们不相互引用?
a = [1,5,3,4]
b = a
a += [6]
我追加6后列出,还追加它B名单,因为他们称对方(如果我已经写了B + = [6],而不是,它会产生相同的结果)。我需要的是将列表b初始化为与列表a相同,但不会引用列表a。
谢谢!
你正在做所谓的浅拷贝。你想做一个深层复制。
这里是蟒蛇上浅诗句深复印的文章: https://docs.python.org/2/library/copy.html
用途:
a = [1,5,3,4]
b = a[:] # <- this is where you need to add ':'
a += [6]
或copy.deepcopy()
(此解决方案是多方面的列表更好,因为它会为每个维度创建一个副本):
import copy
a = [1,5,3,4]
b = copy.deepcopy(a)
a += [6]
或:
b = list(a)
这是什么情况,为什么你有时需要深度复制的解释。在Python中,某些类型的变量(如列表)存储方式稍有不同。当你指定[1, 5, 3, 4]
时,你实际上在做什么是将一个指针分配给一个指针(告诉你该列表在哪里)。当你说b = a
时,你将b赋给一个 - 这是一个指针。所以他们现在都是同一个指针,指向同一个地方。因此,当你改变一个时,另一个也会改变。
现在寻求解决方案。有3个建议的解决方案。
import copy
b = copy.deepcopy(a)
b = a[:]
b = list(a)
第一,做一个深拷贝,永远是可行的,但当然它比其他2
的第二部作品更多的努力,因为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具有相同的指针。这是深层复制为你做的。
请解释你的downvote。 – syntagma 2014-12-04 22:09:53
请记住,尽管解决方案'b = a [:]'适用于单维列表,对于多维度,则需要深度复制 – matts1 2014-12-04 22:15:57