Глобальный словарь и dict_items - PullRequest
0 голосов
/ 28 апреля 2020

Я пытался понять, как работает поиск имен в python, и я возился с глобальным словарем и наткнулся на то, что меня смутило

>>> glob_dict=globals()
>>> glob_items=glob_dict.items()
>>> glob_list=list(glob_items)
>>> user_dict={'a':1,'b':2,'c':3}
>>> user_items=user_dict.items()
>>> user_list=list(user_items)
>>> user_dict['d']=4
>>> user_list
[('a', 1), ('b', 2), ('c', 3)]
>>> glob_list
 ... 'user_list': [('a', 1), ('b', 2), ('c', 3)]}), ('glob_items', ...), ('glob_list', 
[...]), ('user_dict', {'a': 1, 'b': 2, 'c': 3, 'd': 4}), ('user_items', dict_items([('a', 
1), ('b', 2), ('c', 3), ('d', 4)])), ('user_list', [('a', 1), ('b', 2), ('c', 3)])]))]

В glob_list было много элементов поэтому я удалил большинство для целей чтения. Обратите внимание, что в glob_list, когда элемент добавляется в глобальный словарь, он обновляется в списке, который виден по внешнему виду 'user_ite' или 'user_items' или любым другим значениям, когда я пытался обновить его. В пользовательском словаре список остается прежним, хотя user_items обновляется

dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

Что вызывает эту разницу? Мне также кажется, что я не очень хорошо понимаю dict_items, так что это может добавить к путанице. Я (думаю, я) понимаю правила связывания имен и разницу между изменяемыми и неизменяемыми типами. Сначала я подумал, что glob_list ссылается на все еще сохраненный glob_items, который является изменяемым, поэтому он обновлялся. Но тогда то же самое не произошло для user_list, поэтому я полностью сбит с толку. Почему есть разница и что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...