Python列表帮助
简单的Python问题: 示例列表:Python列表帮助,python,list,Python,List,简单的Python问题: 示例列表:A=[1,2,3,4,5] 我需要生成另一个列表B,它是列表a的浅层副本,这样B就是一个新列表,包含相同顺序的相同元素(这样我就可以替换B的一个元素,而不影响a)。我该怎么做 澄清:我想做一些类似的事情 def some_func(A) B = {what do I do here to get a copy of A's elements?} B[0] = some_other_func(B[0]) yet_another_func(B)
A=[1,2,3,4,5]
我需要生成另一个列表B,它是列表a的浅层副本,这样B就是一个新列表,包含相同顺序的相同元素(这样我就可以替换B的一个元素,而不影响a)。我该怎么做
澄清:我想做一些类似的事情
def some_func(A)
B = {what do I do here to get a copy of A's elements?}
B[0] = some_other_func(B[0])
yet_another_func(B)
基于您的所有答案+Python文档,实现我想要的更好的方法是:
def some_func(A)
B = [some_other_func(A[0])] + A[1:]
yet_another_func(B)
谢谢你给我指明了正确的方向 那将是一个深度拷贝,而不是浅拷贝 默认情况下,列出“浅复制”。这就是为什么在中有一个
deepcopy
命令
B=copy.deepcopy(A)
或者,B=A[:]
也可以。但在未来,请记住deepcopy。更复杂的数据类型可以从中受益
添加了有关复制的信息: 浅显副本:
b = [1,2]
a = b
b[0] = 11
print a // [1,11]
深度副本:
b = [1,2]
a = b[:]
b[0] = 11
print a // [1,2]
但是,此外:
>>> a = [[1,2]]
>>> b = a[:]
>>> b
[[1, 2]]
>>> a
[[1, 2]]
>>> a[0][0] = 11
>>> a
[[11, 2]]
>>> b
[[11, 2]]
>>>
因此,在这种情况下,元素本身是浅拷贝。
B=A[:]
就足够了:
In [22]: A=[1,2]
In [23]: B=A[:]
In [24]: B[0]=100
In [25]: A
Out[25]: [1, 2]
In [26]: B
Out[26]: [100, 2]
A[:]
使用切片表示法获取包含A
所有元素的切片。
由于Python列表的片段总是返回新列表,因此您将获得a
的副本
请注意,B内的元件与A内的元件相同。
如果元素是可变的,则通过B对其进行突变将影响A。如下所示:
B = A[:]
导入副本
并使用copy.copy()
进行复制。
请参阅以供参考。您可以通过以下方式执行该复制:
B = A[:]
以下是制作列表a副本的3种方法: 使用切片表示法:
copy_of_A = A[:]
使用列表构造函数:
copy_of_A = list(A)
使用复制模块:
from copy import copy
copy_of_A = copy(A)
按照您的要求,这些副本都是浅层副本。要了解浅拷贝和深拷贝之间的区别,请阅读。如JoshD所述,您需要深拷贝。真的把我们吓坏了!只是补充了一点澄清。我很确定我想要的是浅显的,而不是深奥的副本。@Jason S:你的澄清无助于澄清你需要什么样的副本。看看下面的各种答案。他们可能会透露你想要什么。嗯,那我就不谈“浅拷贝”的意思了。我不需要深度复制,但直接的“B=a”不会复制任何内容,它只是将相同的列表分配给a和B。我想复制a的所有单个元素,但不复制任何子元素。@Jason S:好的。这将是列表的深层副本,但却是列表中元素的浅层副本
B=A[:]
就可以做到这一点。我相信copy。deepcopy
也会对元素进行深度复制。我认为我们都需要澄清什么时候我们指的是列表的浅拷贝和列表中元素的浅拷贝。当我听到列表的浅显副本时,我会想到a=b
。你所做的,我会称之为深度拷贝,即使元素本身是浅拷贝,列表也是深度拷贝。@JoshD:我想你是对的,我误用了这里定义的术语“浅拷贝”:这是一种尴尬的情况,因为两者都在发生。A是B的深拷贝,但A[0]是B[0]的浅拷贝。你现在的答案很好,并且很好地解决了这个问题+1@JasonS,我想我应该更明确地使用我的链接:)也是+1。回答得好。@Jason S,谢谢。我从这个问题中学到了一些东西。所以你也要+1!
from copy import copy
copy_of_A = copy(A)