Python列表帮助

时间:2010-10-22 19:38:00

标签: 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)

根据您的所有答案+ Python文档,我想要的更好的方法是:

def some_func(A)
   B = [some_other_func(A[0])] + A[1:]
   yet_another_func(B)

感谢你指出我正确的方向!

6 个答案:

答案 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以供参考。