Копия словаря () - иногда неглубоко? - PullRequest
2 голосов
/ 27 марта 2019

Согласно официальным документам копия словаря неглубокая, то есть она возвращает новый словарь, содержащий те же пары ключ-значение:

dict1 = {1: "a", 2: "b", 3: "c"}

dict1_alias = dict1
dict1_shallow_copy = dict1.copy()

Насколько я понимаю, если мыdel элемент dict1 обоих dict1_alias & dict1_shallow_copy должен быть затронут;однако, глубокая копия не будет.

del dict1[2]
print(dict1)
>>> {1: 'a', 3: 'c'}  
print(dict1_alias)
>>> {1: 'a', 3: 'c'} 

Но dict1_shallow_copy 2-й элемент все еще там!

print(dict1_shallow_copy)
>>>  {1: 'a', 2: 'b', 3: 'c'}  

Чего мне не хватает?

1 Ответ

3 голосов
/ 27 марта 2019

Мелкая копия означает, что сами элементы одинаковы, но не сам словарь.

>>> a = {'a':[1, 2, 3],  #create a list instance at a['a']
         'b':4,
         'c':'efd'}
>>> b = a.copy()         #shallow copy a
>>> b['a'].append(2)     #change b['a']
>>> b['a']
[1, 2, 3, 2]
>>> a['a']               #a['a'] changes too, it refers to the same list
[1, 2, 3, 2]             
>>> del b['b']           #here we do not change b['b'], we change b
>>> b
{'a': [1, 2, 3, 2], 'c': 'efd'}
>>> a                    #so a remains unchanged
{'a': [1, 2, 3, 2], 'b': 4, 'c': 'efd'}1
...