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

时间:2016-08-09 04:08:15

标签: python python-3.x

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

4 个答案:

答案 0 :(得分:7)

演示浅拷贝的含义:

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

更改a的结构不会反映在b中,因为这是一份副本:

a.pop()
len(a)
=> 1
len(b)
=> 2

要证明与深层副本的区别:更改a中包含的对象(而不是a的结构)就地反映在b中,因为b引用与a相同的对象。

a[0][0] = 'XYZ'
b[0]
=> ['XYZ', 2]

答案 1 :(得分:5)

来自python docs

  

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

     

浅拷贝构造一个新的复合对象然后(到   尽可能地将引用插入到找到的对象中   原本的。深拷贝构造一个新的复合对象,然后,   递归地,将副本插入到其中的对象中   原始

浅拷贝只为顶级/对象创建一个新对象,然后通过引用复制所有子对象。深层复制也为顶层对象/级别和所有子对象创建新对象。

答案 2 :(得分:1)

  

然后修改列表“b”的内容不会根据我读过的内容更改列表“a”。

如果您取出某些内容或将其切换为其他内容,则不会影响ab中保存的对象的突变将通过两个列表可见,因为两个列表都包含相同的对象。

>>> class Mutable(object):
...     def __init__(self, x):
...         self.x = x
...     def __repr__(self):
...         return 'Mutable({})'.format(self.x)
...
>>> a = [Mutable(1), Mutable(2)]
>>> b = a[:]
>>> del b[1]  # Doesn't affect a
>>> a
[Mutable(1), Mutable(2)]
>>> b[0].x = 5  # Visible through a
>>> a
[Mutable(5), Mutable(2)]

答案 3 :(得分:1)

  

然后修改列表“b”的内容将不会根据我读过的内容更改列表“a”。所以,这意味着它的深层次。

不,它没有。浅拷贝与深拷贝的不同之处在于是否复制了包含的值。

在您的情况下,列表会被复制,但两个结果列表将包含相同的对象。在一个列表中添加或删除值不会影响另一个列表,但会反映对包含对象的更改。