dictionary changed size during iteration
Python
Erreur courante
Explication
L'erreur `RuntimeError: dictionary changed size during iteration` survient quand vous **ajoutez ou supprimez des clés** d'un dictionnaire **pendant** que vous le parcourez. Python interdit cette modification en cours d'itération car elle rendrait le parcours incohérent.
```python
scores = {"a": 0, "b": 5, "c": 0}
for cle in scores:
if scores[cle] == 0:
del scores[cle] # suppression pendant l'itération
# RuntimeError: dictionary changed size during iteration
```
Causes courantes
- **Suppression de clés** (`del`, `.pop()`) dans une boucle `for ... in dict`. - **Ajout de clés** au dictionnaire pendant le parcours. - Le même problème existe avec les **sets** modifiés pendant l'itération.
1. Itérez sur une copie des clés
for cle in list(scores): # list() fige les clés au départ
if scores[cle] == 0:
del scores[cle] # ✅ on modifie l'original en toute sécurité
2. Construisez un nouveau dictionnaire (par compréhension)
Souvent plus clair et plus rapide :
scores = {cle: v for cle, v in scores.items() if v != 0}
3. Collectez d'abord, supprimez ensuite
a_supprimer = [cle for cle, v in scores.items() if v == 0]
for cle in a_supprimer:
del scores[cle]
Comment prevenir cette erreur
- **Ne modifiez jamais** la taille d'un dictionnaire (ou d'un set) pendant que vous le parcourez.
- **Préférez les compréhensions** pour filtrer : elles créent une nouvelle structure sans toucher à l'originale en cours de route.
- Référence : [docs.python.org — Dictionnaires](https://docs.python.org/fr/3/library/stdtypes.html#dict).
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacterQuestions frequentes
Pourquoi `list(scores)` règle-t-il le problème ?
Parce que `list(scores)` crée une copie figée des clés *avant* la boucle. Vous itérez sur cette copie, ce qui vous laisse libre de modifier le dictionnaire original sans incohérence.
Le problème se pose-t-il aussi en modifiant seulement les valeurs ?
Non. Changer la **valeur** d'une clé existante (`scores[cle] = 1`) est autorisé pendant l'itération. Seul le changement de **taille** (ajout/suppression de clés) déclenche l'erreur.