How to copy a dictionary and only edit the copy

前端 未结 20 2500
说谎
说谎 2020-11-21 06:59

Can someone please explain this to me? This doesn\'t make any sense to me.

I copy a dictionary into another and edit the second and both are changed. Why is this hap

20条回答
  •  生来不讨喜
    2020-11-21 07:54

    While dict.copy() and dict(dict1) generates a copy, they are only shallow copies. If you want a deep copy, copy.deepcopy(dict1) is required. An example:

    >>> source = {'a': 1, 'b': {'m': 4, 'n': 5, 'o': 6}, 'c': 3}
    >>> copy1 = x.copy()
    >>> copy2 = dict(x)
    >>> import copy
    >>> copy3 = copy.deepcopy(x)
    >>> source['a'] = 10  # a change to first-level properties won't affect copies
    >>> source
    {'a': 10, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
    >>> copy1
    {'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
    >>> copy2
    {'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
    >>> copy3
    {'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
    >>> source['b']['m'] = 40  # a change to deep properties WILL affect shallow copies 'b.m' property
    >>> source
    {'a': 10, 'c': 3, 'b': {'m': 40, 'o': 6, 'n': 5}}
    >>> copy1
    {'a': 1, 'c': 3, 'b': {'m': 40, 'o': 6, 'n': 5}}
    >>> copy2
    {'a': 1, 'c': 3, 'b': {'m': 40, 'o': 6, 'n': 5}}
    >>> copy3  # Deep copy's 'b.m' property is unaffected
    {'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
    

    Regarding shallow vs deep copies, from the Python copy module docs:

    The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):

    • A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
    • A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

提交回复
热议问题