说我有一个包含某些值的列表a
,我做了一个b = a[:]
。然后修改列表b
的内容不会按照我读过的内容更改列表a
。所以,这意味着它的深层次。但python文档仍然将此称为浅拷贝。有人能为我清楚这个吗?
答案 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”。
如果您取出某些内容或将其切换为其他内容,则不会影响a
。 b
中保存的对象的突变将通过两个列表可见,因为两个列表都包含相同的对象。
>>> 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”。所以,这意味着它的深层次。
不,它没有。浅拷贝与深拷贝的不同之处在于是否复制了包含的值。
在您的情况下,列表会被复制,但两个结果列表将包含相同的对象。在一个列表中添加或删除值不会影响另一个列表,但会反映对包含对象的更改。