다음과 같은 리스트가 있다.
num_list=[15,16,22,28]
홀수인 15만을 남기기 위해 짝수를 제거하는 코드를 작성했고, 결과는 다음과 같았다.
22는 짝수인데 왜 지워지지 않고 남아있는 거지?
그 이유는 다음과 같다.
for문에서 num_list의 원본을 그대로 사용하기 때문에 remove를 진행하면서 원본에 손상이 가고 있었다.
remove의 과정을 살펴보기 위해 print를 사용하여 남은 숫자와 지워진 숫자를 살펴보았다.
0번 인덱스에 위치한 15는 홀수이기 때문에 if문 조건에 부합하지 않아 남아있게 된다.
1번 인덱스에 위치한 16은 짝수이기 때문에 if문 조건에 부합하기 때문에 삭제되어 num_list는 [15,22,28]이 된다.
for 문에서 처음에 선언한 num_list를 그대로 사용하기 때문에 이때 num_list는 [15,22,28]이 되는 것이다.
그렇기 때문에 [15,22,28]에서 2번 인덱스에 위치한 28이 다음 for문의 i가 되는 것이고, 이는 if문 조건에 부합하기 때문에 삭제되며 num_list는 [15,22]가 된다.
단순히 짝수를 지우는 for문을 작성했다고 생각했으나 위 코드는 원본 리스트를 그대로 사용하므로써 remove 과정에서 원본 리스트에 손상을 입힌다.
따라서 15만을 남기기 위해서는 for문에서 num_list의 요소를 가져올 때 리스트의 복사본을 사용해야 한다.
num_list[:] 와 같이 작성하면 num_list의 복사본을 사용할 수 있게 되어 for문에서는 num_list의 모든 요소를 한 번씩 돌 수 있게 되고, 조건에 맞는 요소는 원본 num_list에서 삭제하여 원하는 결과를 얻을 수 있다.
num_list=[15,16,22,28]
for i in num_list[:]:
if i%2==0:
num_list.remove(i)
print(num_list)
위 코드를 실행해보면 [15]만 출력되는 것을 확인할 수 있다.
이 역시도 과정을 살펴보면 다음과 같다.
모든 짝수가 num_list에서 순서대로 지워지는 것을 확인할 수 있다.
파이썬에서 리스트 remove 사용 시 위와 같은 for문에서 건너뛰는 현상이나 조건에 맞는 요소가 지워지지 않으면 꼭 확인해봐야 하는 부분이다.