본문 바로가기
프로그래밍 언어/Python

RuntimeError: dictionary changed size during iteration 해결

by pagehit 2020. 12. 5.
반응형

파이썬(python) 딕셔너리(dictionary) 자료구조와 관련된 에러이다.

test.py
# wrong
a = {1: 'a', 2: 'b', 3: 'c'}

for i in a:
    if i == 2:
        a.pop(i)
Traceback (most recent call last):
  File "/home/sh/exercises/dummies/python/dump.py", line 3, in <module>
    for i in a:
RuntimeError: dictionary changed size during iteration

 

딕셔너리를 순회할 때, 딕셔너리 크기가 변경되면 발생한다.
파이썬 3.x 에서는 리스트를 list(a) 형태로 복사하여 해결한다.

# correct
a = {1: 'a', 2: 'b', 3: 'c'}

for i in list(a):
    if i == 2:
        a.pop(i)

 

defaultdict()와 함께 사용할 때의 문제

# wrong
import collections

a = collections.defaultdict(list)
a[1] = 'a'
a[2] = 'b'
a[3] = 'c'

for i in a:
    print(a[i+1])
b
c
[]
Traceback (most recent call last):
  File "/home/sh/exercises/dummies/python/dump.py", line 8, in 
    for i in a:
RuntimeError: dictionary changed size during iteration

 

defaultdict을 사용하면 존재하지 않는 키(key)를 조회할 때 null error가 발생하지 않도록 default를 생성한다.
이때 딕셔너리 크기가 변경되면서 에러가 발생한다.
마찬가지로 list()를 통해 복사본을 만들어 해결한다.

# correct
import collections

a = collections.defaultdict(list)
a[1] = 'a'
a[2] = 'b'
a[3] = 'c'

for i in list(a):
    print(a[i+1])

 

반응형

댓글