파이썬 리스트에 부분 복사(copy)를 해보자.
다음 상황을 가정해보자. 두개의 list가 있다. list_A 에는 0부터 9까지 총 10개의 요소가 있고, list_B에는 10부터 19까지 역시 10개의 요소가 있다고 하자. 이때 list_A의 값을 list_B의 값으로 변경하고 싶다고 할 때, 보통은 대입연산자 '='를 써서 처리한다.
그럼 아래 터미널에서 실제 동작하는 것을 확인해보자.
list_A와 list_B를 생성하고, 주소값을 확인해보니 아래와 같았다.
id(list_A): 4318977152
id(list_B): 4318977664
즉, list_A와 list_B는 서로 다른 주소를 가지고 있는 상태였다.
이때 list_A를 list_B의 값으로 복사하고 싶어서, 대입연산자('=')를 사용하는 경우,
list_A와 list_B의 값은 동일해졌으나, 그 두 리스트 변수의 주소값(id) 마져 동일하게 나오는 것을 마지막에서 확인할 수 있다.
id(list_A): 4318977664
id(list_B): 4318977664
이때 문제는 list_A를 수정해도, list_B를 수정해도 양쪽 모두 변경된다는 것이다. 둘은 동일한 주소를 가지고 있기 때문에.
더구나 list_A가 원래 가지고 있던 메모리는 더이상 access가 불가능하고, reference count가 0이 되어 메모리에서 해제된다.
한두번이라면 메모리를 잡고, 해제하고 하는 것이 큰 문제가 안될 수 있으나, 수백만번 반복하면 당연히 성능이 떨어진다.
가능하면 한번 잡은 메모리는 계속 사용하는 것이 좋다.
그러면 어떻게 하는가?
리스트의 값을 그대로 복사하는 방법을 사용하면 된다.
리스트 값을 그대로 복사하기 위해서는 list.copy() 를 사용하면 된다.
별도의 주소값을 유지하고 있으니, 리스트 값의 변화가 다른 쪽에 영향을 주지 않는다.
그러므로 기억하자.
리스트 복사시에 단순히 대입연산자를 쓰면 포인터를 대입하는 것이고, list.copy()를 쓰면 그 값 자체를 복사해오는 것을 잊지말자.
안그러면 list_B의 값만 수정했는데 왜 list_A의 값도 수정되었는지 모르겠다고 머리를 싸메는 경우가 발생할 수 있다.
그럼 이만.
'Python' 카테고리의 다른 글
Protobuf 를 쉽게 사용해보자 (1/2) (0) | 2025.03.08 |
---|---|
파이썬 리스트 깊은 복사(deep copy) vs 얕은 복사(shallow copy) (1) | 2025.03.05 |
간단한 설정파일을 직접 만들어서 사용해보자 (0) | 2025.03.01 |
캡쳐한 그림으로 binary parsing 을 해보자 (0) | 2025.02.28 |
PySide6 에서 Tab 구현하기 (ChatGPT를 이용하여) (0) | 2025.02.27 |