본문 바로가기
컴퓨터공학/파이썬

for 문은 인덱스 중심으로 돌아간다.

by 딩코딩코 2019. 10. 18.

한 코드를 검토하는데 깨달음을 얻은 코드가 있다.

a = [1,2,3,4,5,6]
for i in a:
    print(a)
    a.remove(i)

예상 결과는 이랬어야 했다.
[1,2,3,4,5,6]
[2,3,4,5,6]
[3,4,5,6]
...
[6]

그러나 실제 결과는 이랬다.
[1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6]
[2, 4, 5, 6]

예상과 다른 결과가 나온 이유는 간단하면서도 새롭게 알게된 점이 있었다.
1. 간단한 이유 : for i in a 에서 a가 remove로 인해 바뀌는데, a가 바뀌지 않는다고 생각한 것이다.
2. 새로 알게 된 점 : for문에서 a가 변하더라도, i가 가리키는 값은 index[0]부터 하나씩 올라가면서 출력하기 때문이다.

즉, 위에서 for 문이 돌아가는 구조는 이렇다.

실행 횟수 리스트 a i 값
첫 번째 [1,2,3,4,5,6] a[0] == 1
두 번째 [2,3,4,5,6] a[1] == 3
세 번째 [2,4,5,6] a[2] == 5
네 번째 [2,4,6] a[3] ==  없음 => 종료

프로그래머가 의도한대로 하려면, a 리스트를 복사한 리스트를 기준으로 돌렸어야 했을 것이다.
b = a[:]
for i in b:
    print(a)
    a.remove(i)

어처구니 없는 코드였지만 좋은 깨달음이었다.

'컴퓨터공학 > 파이썬' 카테고리의 다른 글

round(1.555,2) 는 1.55이다?  (0) 2019.10.19