본문 바로가기

Python

파이썬 리스트 복사(list copy)

파이썬 리스트에 부분 복사(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_B만 수정하였는데, list_A의 값도 바뀌였다.

더구나 list_A가 원래 가지고 있던 메모리는 더이상 access가 불가능하고, reference count가 0이 되어 메모리에서 해제된다.

한두번이라면 메모리를 잡고, 해제하고 하는 것이 큰 문제가 안될 수 있으나, 수백만번 반복하면 당연히 성능이 떨어진다. 

가능하면 한번 잡은 메모리는 계속 사용하는 것이 좋다. 

 

그러면 어떻게 하는가?

 

리스트의 값을 그대로 복사하는 방법을 사용하면 된다. 

리스트 값을 그대로 복사하기 위해서는 list.copy() 를 사용하면 된다. 

리스트가 복사되었지만, 여전히 처음의 주소값을 그대로 유지하고 있다.

 

별도의 주소값을 유지하고 있으니, 리스트 값의 변화가 다른 쪽에 영향을 주지 않는다. 

list_B를 변화시켜도 list_A는 변화가 없다.

 

그러므로 기억하자.

리스트 복사시에 단순히 대입연산자를 쓰면 포인터를 대입하는 것이고, list.copy()를 쓰면 그 값 자체를 복사해오는 것을 잊지말자.

안그러면 list_B의 값만 수정했는데 왜 list_A의 값도 수정되었는지 모르겠다고 머리를 싸메는 경우가 발생할 수 있다. 

 

그럼 이만.