본문 바로가기

카테고리 없음

[python3] RuntimeError: dictionary changed size during iteration 해결하는 방법

반응형

 

dictionary 타입을 iteration 하다가 중간에 내부의 내용을 삭제하는 경우에

'RuntimeError: dictionary changed size during iteration' 에러가 발생한다.

 

에러가 발생하는 예시코드다

import sys

dict1 = dict()
dict1['a'] = 1
dict1['b'] = 2
dict1['c'] = 1

for k in dict1.keys():
    if dict1[k] == 1:
        del(dict1[k]) print(dict1)

 

그렇다면 어떻게 수정하면 가능할까?

view object인 keys 대신

 list로 수행하면 된다.

 

import sys

dict1 = dict()
dict1['a'] = 1
dict1['b'] = 2
dict1['c'] = 1

for k in list(dict1):
    if dict1[k] == 1:
        del(dict1[k]) print(dict1)

 

그렇다면 왜 이런 일이 발생할까?

이는 dictionary의 keys() return value가 dict_type이라는 reference 기반의 오브젝트이기 때문이다.

>>> print(type(dict1.keys()))
<class 'dict_keys'>
>>> print(type(list(dict1.keys())))
<class 'list'>

 

python에서는 dictionary를 mutable한 변수로 보고 있고 데이터가 변경되면 이를 반영하기 때문이다.

그렇기 때문에 iteration을 수행하는 도중에 key가 삭제되면 keys의 경우 view object로 데이터 변경이 반영되기 때문에 사이즈 변경을 인지하여 runtime 에러를 발생시키는 것이다.

반응형