在阅读的文档时dict.copy(),它说它是字典的浅表副本。我关注的书(Beazley的Python参考)也是如此,该书说:
dict.copy()
m.copy()方法对映射对象中包含的项目进行浅表复制,并将其放置在新的映射对象中。
m.copy()
考虑一下:
>>> original = dict(a=1, b=2) >>> new = original.copy() >>> new.update({'c': 3}) >>> original {'a': 1, 'b': 2} >>> new {'a': 1, 'c': 3, 'b': 2}
因此,我认为这也将更新original(并添加'c':3)的值,因为我正在执行浅表复制。就像你对列表进行操作一样:
original
'c':3
>>> original = [1, 2, 3] >>> new = original >>> new.append(4) >>> new, original ([1, 2, 3, 4], [1, 2, 3, 4])
这按预期工作。
由于两者都是浅表副本,为什么为什么dict.copy()按我的预期无法正常工作?还是我对浅复制和深复制的理解存在缺陷?
“浅复制”表示字典的内容不是按值复制,而只是创建一个新引用。
>>> a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) >>> a[1].append(4) >>> a, b ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
相反,深拷贝将按值复制所有内容。
>>> import copy >>> c = copy.deepcopy(a) >>> a, c ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]}) >>> a[1].append(5) >>> a, c ({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
所以:
b = a
‘a = b’的图示:’a’和’b’都指向’{1:L}’,’L’指向’[1、2、3]。
b = a.copy()
‘b = a.copy()’的图示:’a’指向’{1:L}’,’b’指向’{1:M}’,’L’和’M’都指向’[ 1,2,3]”。
b = copy.deepcopy(a)
‘b = copy.deepcopy(a)’的图示:’a’指向’{1:L}’,’L’指向’[1、2、3]’; ‘b’指向’{1:M}’,’M’指向’[1,2,3]’的另一个实例。