파이썬 리스트 복사의 함정
- list1의 값을 변경해야하는데 기존 list1의 값도 따로 저장해두고 싶다면, 리스트를 복사한 새로운 리스트를 만들어야 한다.
- list1을 그대로 복사한 list2를 만들고 싶다면 어떻게 해야할까?
그냥 새로운 변수에 할당하면?
list1 = [1, 2, 3, 4]
list2 = list1
list1[0] += 2
print(list1)
print(list2)
- 분명 list2라는 새로운 리스트를 만들었는데, list1에 변경한 값이 그대로 출력되는 것을 알 수 있다.
- 파이썬에서 변수는 값이 저장되어 있는 메모리의 주소값을 저장하기 때문이다
- 위 방법처럼 할당했을 때, list2는 list1이 저장한 주소값을 가져온 것이 되므로 메모리에 바뀐 값이 그대로 반영되어 출력되는 것이다.
- 이는 주소값을 출력하는
id()
함수를 이용하면 확인할 수 있다.
list1 = [1, 2, 3, 4]
list2 = list1
print(id(list1))
print(id(list2))
- [1, 2, 3, 4]를 저장하는 새로운 객체를 만들고 싶다면 다른 방법을 이용해야한다.
리스트를 올바르게 복사하는 방법
- 여러가지 방법이 있지만, 가독성 면에서 좋은 방법이라 생각되는 두 가지만 소개한다.
1. list()
함수
- list 자료형의 객체를 생성하는
list()
함수를 이용할 수 있다.
list1 = [1, 2, 3, 4]
list2 = list(list1)
print(id(list1))
print(id(list2))
2. copy()
메소드
- Python3 부터 지원하는 리스트 객체의 메소드이다.
- 파라미터 없이 새로운 리스트 객체를 만들어 반환한다.
list1 = [1, 2, 3, 4]
list2 = list1.copy()
print(id(list1))
print(id(list2))
확인
list1 = [1, 2, 3, 4]
list2 = list1
list3 = list(list1)
list4 = list1.copy()
list1[0] += 2
list3[1] += 2
list4[2] += 2
print(list1)
print(list2)
print(list3)
print(list4)
- list1의 주소를 복사한 list2를 제외하면, 모두 별개의 객체임을 확인할 수 있다.