Python, изменяющий записи dict на месте во время итерации - PullRequest
0 голосов
/ 15 сентября 2018

Я знаю, что в общем случае небезопасно изменять кодировку при ее повторении:

d = {1: 2, 3: 4}
for k in d.keys():
    d[k + 1] = d[k] + 1

Это дает RuntimeError, как и ожидалось. Однако, читая документацию для dict, я обнаружил следующее (выделение мое):

Итерация представлений при добавлении или удалении записей в словаре может вызвать RuntimeError или не сможет выполнить итерацию по всем записям.

Итак, я попробовал следующий код:

d = {1: 2, 3: 4}
for k in d.keys():
    d[k] = d[k] + 1

Примечание: я не добавлял и не удалял записи во время итерации; Я только обновил существующие записи. Я попробовал это с несколькими примерами и до сих пор не получил RuntimeError, и цикл работает, как ожидалось.

Гарантируется ли это на языке? Или мне просто повезло?

Примечание: я использую Python 3, поэтому d.keys() возвращает динамическое представление, а не list).

1 Ответ

0 голосов
/ 15 сентября 2018

Внутренняя структура словаря определяется ключами, а не значениями. По крайней мере, в настоящее время. Это означает, что вы можете изменить значение, связанное с ключом, но добавление или удаление ключей (что делает d[k + 1] = d[k] + 1 в первом примере) вызовет проблемы.

...