Python列表帮助

Jas*_*n S 2 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)
Run Code Online (Sandbox Code Playgroud)

根据您的所有答案+ Python文档,更好的方法来做我想要的是以下内容:

def some_func(A)
   B = [some_other_func(A[0])] + A[1:]
   yet_another_func(B)
Run Code Online (Sandbox Code Playgroud)

谢谢你指点我正确的方向!

Jos*_*shD 8

这将是一个深刻的副本,而不是浅薄的副本.

列表默认情况下复制浅.这就是复制模块中deepcopy命令的原因.

B = copy.deepcopy(A)

可选地,B = A[:]将会这样做.但是为了将来要记住深度复印.更复杂的数据类型可以从中受益.


添加有关副本的信息:

浅拷贝:

b = [1,2]
a = b
b[0] = 11
print a  // [1,11]
Run Code Online (Sandbox Code Playgroud)

深刻的副本:

b = [1,2]
a = b[:]
b[0] = 11
print a  // [1,2]
Run Code Online (Sandbox Code Playgroud)

但是,此外:

>>> a = [[1,2]]
>>> b = a[:]
>>> b
[[1, 2]]
>>> a
[[1, 2]]
>>> a[0][0] = 11
>>> a
[[11, 2]]
>>> b
[[11, 2]]
>>>
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,元素本身就是浅层副本.


Ste*_*ski 5

以下是制作列表A副本的3种方法:

使用切片表示法:

copy_of_A = A[:]
Run Code Online (Sandbox Code Playgroud)

使用列表构造函数:

copy_of_A = list(A)
Run Code Online (Sandbox Code Playgroud)

使用复制模块:

from copy import copy
copy_of_A = copy(A)
Run Code Online (Sandbox Code Playgroud)

正如您所要求的,这些副本都是浅色副本.要了解浅拷贝和深拷贝之间的区别,请阅读拷贝模块文档.