1
0
mirror of https://github.com/satwikkansal/wtfpython synced 2024-11-21 18:54:20 +01:00

Translate Modifying dictionary while iterating over it example

This commit is contained in:
Vadim Nifadev 2024-04-22 15:37:59 +03:00
parent 3fc9e9e028
commit eccd68a4bd

View File

@ -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) для получения более подробной информации об изменении лимита по умолчанию, если вы ожидаете, что ваш код превысит это значение.
---
## Секция: Скользкие склоны
### ▶ Изменение словаря во время прохода по нему
<!-- Example ID: b4e5cdfb-c3a8-4112-bd38-e2356d801c41 --->
```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`.
---