본문 바로가기
컴퓨터/Python

[Python] 파이썬, for문에서 remove() 함수 쓸 때 반드시 확인할 것

by sjblog 2022. 1. 7.
반응형

1. for문에서 remove() 쓸 때 문제점

리스트를 for문으로 돌릴 때,

remove() 함수로 리스트의 원소를 제거할 때가 있다.

 

예를 들어,

CODES = [1,2,3,4]

for code in CODES:
    print(code)
    if code == 2:
        CODES.remove(2)
    print(CODES)

결과

1

[1, 2, 3, 4, 5]

 

2

[1, 3, 4, 5]

 

4

[1, 3, 4, 5]


1 2  다음이 3 이 아니라 4가 나온다.

 

for문에서 2의 순서일 때

remove() 함수로 리스트 CODES에서 2가 삭제되었기 때문이다.

 

그래서, 2의 자리에 3이 오고, 다음 순서인 4가 실행된 것이다.

 

즉, for문이 CODES를 돌고 있는데 돌고 있는 CODES가 훼손되어 오류가 난 것이다.

 

 

2. 해결 방법

CODES = [1,2,3,4]

for code in CODES[:]:
    print(code)
    if code == 2:
        CODES.remove(2)
    print(CODES)

for code in CODES[:]:

# CODES[:] 로 수정하여 CODES의 원본 복사본을 직접 넣는다.

 

 

 

특히, for문 안에 사용자 정의 함수(def)를 넣는 경우,

 

def 안에 remove() 함수가 사용될 수 있고

이런 경우, remove() 함수가 for문안에 사용되었는지 직관적으로 알아채기 어려우므로 주의가 필요하다.

 

3. 딕셔너리

딕셔너리 또한 for문에서 오류가 발생할 수 있습니다.

 

for문에서 딕셔너리를 삭제하기 위해 del을 사용할 경우

RuntimeError: dictionary changed size during iteration

오류가 발생할 수 있고,

 

리스트에서 하던 것처럼 [:]를 사용할 경우

slice 오류가 발생할 수 있습니다.

 

 

3-1. 해결방법

dictionary = dict()
dictionary['a'] = 1

for dic in list(dictionary):
	print(dic)
    del dictionary['a']

for문 딕셔너리에 list()로, 리스트화 합니다.

 

 

 

반응형