더북(TheBook)

무언가 이상하다. a_list의 마지막 항목은 [5, 10]이었다. 그런데 a_list에 영향을 미치지 않아야 할 b_list의 수정으로 인해 a_list의 마지막 항목이 [0, 0]으로 변경되었다! 무슨 일이 일어난 것일까?

앞서 언급했듯이 깊은 복사는 1, 2를 복사하고 내부 리스트의 참조를 복사한 것이다. 결과적으로 b_list의 변경 사항은 항목을 컬렉션으로 갖는 a_list에 영향을 미치게 된다.

▲ 그림 3-4 얕은 복사

이제 문제가 보일 것이다. 항목 간 복사를 시도했지만, 리스트가 품고 있는 리스트는 참조였기 때문에 a_listb_list 내부의 두 리스트는 결국 하나의 리스트를 참조하게 된다.

해결책은 간단하다. 원하는 결과를 얻으려면 깊은 복사(deep copy)를 해야 한다. 깊은 복사를 시도하면 내부 리스트도 제대로 복사된다. copy 패키지를 탑재(import)한 후 copy.deepcopy 함수를 사용하면 된다.

import copy
a_list = [1, 2, [5, 10]]
b_list = copy.deepcopy(a_list)      # 깊은 복사로 복제본 만들기
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.