From eccd68a4bd276b7dd7b1dda7a9bbbca44407f40e Mon Sep 17 00:00:00 2001 From: Vadim Nifadev <36514612+nifadyev@users.noreply.github.com> Date: Mon, 22 Apr 2024 15:37:59 +0300 Subject: [PATCH] Translate Modifying dictionary while iterating over it example --- translations/README-ru.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/translations/README-ru.md b/translations/README-ru.md index 6309e60..f880219 100644 --- a/translations/README-ru.md +++ b/translations/README-ru.md @@ -1951,3 +1951,42 @@ ValueError: Exceeds the limit (4300) for integer string conversion: [Смотри документацию](https://docs.python.org/3/library/stdtypes.html#int-max-str-digits) для получения более подробной информации об изменении лимита по умолчанию, если вы ожидаете, что ваш код превысит это значение. --- + + +## Секция: Скользкие склоны + +### ▶ Изменение словаря во время прохода по нему + +```py +x = {0: None} + +for i in x: + del x[i] + x[i+1] = None + print(i) +``` + +**Результат (Python 2.7- Python 3.5):** + +``` +0 +1 +2 +3 +4 +5 +6 +7 +``` + +Да, цикл выполняет ровно **восемь** итераций и завершается. + +#### 💡 Объяснение: + +* Проход по словарю и его одновременное редактирование не поддерживается. +* Выполняется восемь проходов, потому что именно в этот момент словарь изменяет размер, чтобы вместить больше ключей (у нас есть восемь записей об удалении, поэтому необходимо изменить размер). На самом деле это деталь реализации. +* То, как обрабатываются удаленные ключи и когда происходит изменение размера, может отличаться в разных реализациях Python. +* Так что для версий Python, отличных от Python 2.7 - Python 3.5, количество записей может отличаться от 8 (но каким бы ни было количество записей, оно будет одинаковым при каждом запуске). Обсуждения по этому поводу имеются в [issue](https://github.com/satwikkansal/wtfpython/issues/53) и на [StackOverflow](https://stackoverflow.com/questions/44763802/bug-in-python-dict). +* В Python 3.7.6 и выше при попытке запустить пример вызывается исключение `RuntimeError: dictionary keys changed during iteration`. + +---