반응형
파이썬(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])
반응형
댓글