2015-04-19 1 views
4

Я понимаю, что мутирующие словари при переходе через них могут вызывать ошибки во время выполнения, но я знаю, что есть правильные способы сделать это, и я не могу понять, какие из них приемлемы а какие нет. Консольное тестирование их не помогает, потому что они МОГУТ производить ошибки во время выполнения, я не уверен, что я получаю это правильно или просто получаю удачу.Python - отличия в том, как я мутирую словари в цикле for

Скажем, у меня есть атрибут, статус, то есть словарь статусов:

self.status = {"overall": False, "started":False, 
       "ready":False, "awakeQueried":False, 
       "allQueried":False} 

Эти изменения в различных трас или Falses в течение хода. У меня есть функция, которая обрабатывает сбой и хочет установить все из них в False. Какой изящный способ? До сих пор я эту работу, но я не уверен, если я буду работать в ошибки во время выполнения какой-то момент:

self.status = {key:False for key in self.status} 

Могу ли я сделать это? Здесь я не уверен в низкоуровневом функционировании. Я не делаю копию с .items() или тому подобное. Я переписываю словарь, но сначала он должен обрабатывать правую сторону, но это понимание, поэтому я не уверен, что он полностью завершает понимание перед перезаписью self.status. Хранит ли он какую-то копию в памяти, в то время как он понимает новый dict, а затем устанавливает его или выполняет циклическое определение и установку элементов после каждой итерации (где я думаю, что возникнут проблемы)?

ответ

3

Это будет работать именно по этой причине: правостороннее понимание создает новый словарь и завершается до того, как ему будет установлен self.status.

1

Да, что будет работать. В Python переменные являются ссылками, поэтому вы создаете новый словарь справа, а затем назначаете его за один шаг до self.status, не оставляя места для ошибок чтения и записи в один dict.