한 코드를 검토하는데 깨달음을 얻은 코드가 있다.
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 |
---|