简单的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)
根据您的所有答案+ Python文档,我想要的更好的方法是:
def some_func(A)
B = [some_other_func(A[0])] + A[1:]
yet_another_func(B)
感谢你指出我正确的方向!
答案 0 :(得分:8)
这将是一个深刻的副本,而不是浅薄的副本。
列表默认情况下复制浅。这就是copy module中有deepcopy
命令的原因。
B = copy.deepcopy(A)
可选择B = A[:]
。但是为了将来要记住深度复印。更复杂的数据类型可以从中受益。
添加了有关副本的信息:
浅拷贝:
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]]
>>>
因此,在这种情况下,元素本身就是浅层副本。
答案 1 :(得分:5)
以下是制作列表A副本的3种方法:
使用切片表示法:
copy_of_A = A[:]
使用列表构造函数:
copy_of_A = list(A)
使用复制模块:
from copy import copy
copy_of_A = copy(A)
正如您所要求的,这些副本都是浅色副本。要了解浅拷贝和深拷贝之间的区别,请阅读documentation of the copy module。
答案 2 :(得分:3)
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。
答案 3 :(得分:3)
像这样:
B = A[:]
答案 4 :(得分:3)
您可以通过以下方式执行该副本:
B = A[:]
答案 5 :(得分:2)
import copy
A=[1,2,3,4,5]
B=copy.copy(A)
B[0]=9999
print B[0]
print A[0]
import copy
并使用copy.copy()
进行复制。
请参阅this以供参考。