在python中使用[:]或copy()复制列表很浅?

Mur*_*phy 5 python python-3.x

说我有一个a带有一些值的列表,我做了一个b = a[:].然后修改列表的内容b将不会a根据我读过的内容更改列表.所以,这意味着它的深层次.但python文档仍然将此称为浅拷贝.有人能为我清楚这个吗?

shx*_*hx2 8

要证明浅拷贝意味着什么:

a = [ [1,2], [3,4,5] ]
b = a[:]  # make a shallow copy
a is b  # not the same object, because this is a copy
=> False
a == b  # same value, because this is a copy
=> True
a[0] is b[0]  # elements are the *same objects*, because this is a *shallow* copy
=> True
Run Code Online (Sandbox Code Playgroud)

改变结构a将不会反映出来b,因为这是一个副本:

a.pop()
len(a)
=> 1
len(b)
=> 2
Run Code Online (Sandbox Code Playgroud)

为了证明与深拷贝的区别:在原地更改包含在a(而不是a's结构)中的对象,反映在b,因为b引用相同的对象a.

a[0][0] = 'XYZ'
b[0]
=> ['XYZ', 2]
Run Code Online (Sandbox Code Playgroud)


lev*_*evi 5

来自python docs

浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:

浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中.深层复制构造一个新的复合对象,然后递归地将复制对象插入到原始对象中找到的对象中.

浅复制仅为顶级/对象创建新对象,然后通过引用复制所有子对象.深层复制也为顶层对象/级别以及所有子对象创建新对象.