본문 바로가기

study/python

파이썬 for문과 리스트 원소 제거 주의

파이썬에서 for문과 함께 리스트의 원소를 제거할 때 문제가 발생한다.

a = [1,2,3,4,5,6,7,8,9]

for num in a:
	if num%2 == 0:
    	a.remove(num)

다음 코드를 실행하면 a = [1,3,5,7,9]가 나온다.

이상 없어보이지만 실은 코드가 실행될 때 for문은 9번이 아닌 5번만 실행된다.

 

첫번째 실행하면 num은 1이기 때문에 삭제가 일어나지 않는다.

 

두번째부터 문제가 발생한다. num은 짝수이기 때문에 if문이 작동한다. 그러면 a = [1,3,4,5,6,7,8,9] 가 된다.

 

세번째 for문이 실행될 때, num은 3이 아니라 4가 된다. for문이 세번째 실행되면서 리스트의 3번째 요소를 가져온다. 그래서 공교롭게도 나머지 for문이 실행되면서 짝수만 접근하게 되어, 정상같이 보인다.

 

그래서 제대로 작동하게 하려면 리스트 복사를 통해 접근해야 한다.(stackoverflow.com/questions/1207406/how-to-remove-items-from-a-list-while-iterating/1207461#1207461)

 

a = [1,2,3,4,5,6,7,8,9]

for num in a[:]:
	if num%2 == 0:
    	a.remove(num)

이 코드는 for문이 9번 작동한다.

 

리스트의 원소를 추가할 때도 마찬가지다