list = [1,2,3,4,5]
for i in list:
if i == 3:
list.remove(i)
print(i)
이 간단한 코드를 보자.
list에서 원소를 하나씩 꺼내며 출력하고 있다.
중간에 i가 3일때는 3을 리스트에서 삭제하고, 하던 일을 계속한다.
그 다음의 리스트는 [1,2,4,5] 일 것이고, 순서에 의해 4가 출력되어야 할 것 같았다.
하지만, 출력 결과는
1
2
3
5
이다.
큰 고민 없이 i in list 문법은 원소를 하나씩 잡아서 일을 수행하는 줄 알았는데, 그렇지 않다는 것을 알 수 있다.
결국 이는
list = [1,2,3,4,5]
for i in range(len(list)):
if i == 3:
list.remove(list[i])
print(list[i])
와 유사한 코드라고 할 수 있지만, 이 코드는 오류가 난다. 왜일까?
5번째 반복에서 list index out of range가 뜨기 때문이다.
처음과 비슷한 예시로, 이번에는 i가 3일 때 리스트 앞에 원소를 insert해보았다.
list = [1,2,3,4,5]
for i in list:
if i == 3:
list.insert(0,0)
print(i)
결과는?
1
2
3
3
3
3
...
무한루프가 난다.
i in list 반복문은 실시간으로 존재하는 원소에 대한 순회를 한다. 그리고 원소 기반이 아닌 인덱스 기반이라고 할 수 있다.
결론은, 반복문 중간에는 리스트 변경을 지양하고, 필요한 변경은 복사를 통해 반영하도록 하자.