알고리즘 문제를 풀다가 다음과 같은 상황을 마주했다.
>>> num_list = [1, 2, 3, 4, 5, 6]
>>> for n in num_list:
... num_list.remove(n)
...
>>> num_list
[2, 4, 6]
num_list
를 iterate 하면서 처음 요소부터 끝까지 지우면 num_list
가 빈 리스트가 될 줄 알았었다. 하지만 그렇지 않았다.
왜냐면 예를 들어보자.
n 이 1 일 때 num_list 의 1을 지우면 num_list 의 2 가 0번 인덱스로 이동한다.
그렇다면 두 번째 iteration 에서 n 의 값은
1 번째 인덱스인 3 을 가리키기 때문에
이미 0번 째 인덱스가 되어버린 2 를 삭제하는 것이 아니라 인덱스가 1 인 3을 삭제한다.
>>> num_list = [1, 2, 3, 4, 5, 6]
>>> for n in num_list[:]:
... num_list.remove(n)
...
>>> num_list
[]
>>>
- list의 슬라이싱을 통한 새로운 값을 할당한다.
- 슬라이싱을 통해서 값을 할당하면 해당 객체에 새로운 id가 부여되며, 서로 영향을 받지 않는다.
위 처럼 방법은 매우 간단하다. iterate 를 할 객체 자체를 새로운 리스트로 (num_list[:]
) 카피해버리면 된다.
쉽게 말하면 복합객체에서 껍데기 말고 내용물까지 변경할 때 사용한다. 자세한건 예전에 쓴 포스팅을 참고해보자.