Python-了解dict.copy()-浅还是深?

发布于 2021-02-02 23:15:18

在阅读的文档时dict.copy(),它说它是字典的浅表副本。我关注的书(Beazley的Python参考)也是如此,该书说:

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()按我的预期无法正常工作?还是我对浅复制和深复制的理解存在缺陷?

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    “浅复制”表示字典的内容不是按值复制,而只是创建一个新引用。

    >>> 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 = b’的图示:’a’和’b’都指向’{1:L}’,’L’指向’[1、2、3]。

    1. b = a.copy():浅拷贝,a并且b将成为两个独立的对象,但其内容仍共享相同的参考

    ‘b = a.copy()’的图示:’a’指向’{1:L}’,’b’指向’{1:M}’,’L’和’M’都指向’[ 1,2,3]”。

    1. b = copy.deepcopy(a):深度复制,a并且b的结构和内容变得完全孤立。

    ‘b = copy.deepcopy(a)’的图示:’a’指向’{1:L}’,’L’指向’[1、2、3]’; ‘b’指向’{1:M}’,’M’指向’[1,2,3]’的另一个实例。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看