理解 dict.copy() - 浅的还是深的?
·
回答问题
在阅读dict.copy()的文档时,它说它制作了字典的浅表副本。我正在关注的书(Beazley's Python Reference)也是如此,它说:
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 = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
这按预期工作。
既然都是浅拷贝,为什么dict.copy()不能像我预期的那样工作?还是我对浅拷贝和深拷贝的理解有缺陷?
Answers
“浅拷贝”意味着字典的 content 不是按值复制的,而只是创建一个新的引用。
>>> 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]})
所以:
1、b = a:引用赋值,使a和b指向同一个对象。
!['a u003d b'的说明:'a'和'b'都指向'{1: L}','L'指向'[1, 2, 3]'。](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/9e55551371_4AQC6.jpg)
2、b = a.copy():浅拷贝,a和b会变成两个孤立的对象,但是它们的内容还是共享同一个引用
!['b u003d a.copy()'的说明:'a'指向'{1:L}','b'指向'{1:M}','L'和'M'都指向' [1、2、3]'。](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/a6d9c8f5a7_Vtk4m.jpg)
3、b = copy.deepcopy(a):深拷贝,a和b的结构和内容完全隔离。
!['b u003d copy.deepcopy(a)'的说明:'a'指向'{1:L}','L'指向'[1, 2, 3]'; 'b' 指向 '{1: M}','M' 指向 '[1, 2, 3]' 的不同实例。](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/fcfce10ef9_BO4qO.jpg)
更多推荐

所有评论(0)