Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 리스트를 복사하는 다양한 방법 완벽 정리

파이썬에서 리스트를 복사하는 방법

파이썬에서 대입 연산자(=)는 새로운 객체를 생성하지 않습니다. 단순히 기존 객체에 또 다른 이름을 붙여줄 뿐인데요. 이는 id() 함수를 통해 확인할 수 있습니다.

>>> L1 = [1,2,3,4]
>>> L2 = L1
>>> id(L1)
185117137928
>>> id(L2)
185117137928

L1L2id 값이 동일한 것을 볼 수 있습니다. 즉, 두 변수는 같은 객체를 참조하고 있으므로 한쪽을 수정하면 다른 쪽도 함께 변경됩니다. 진짜 복사본을 만들려면 아래의 방법들을 사용해야 합니다.

1. 슬라이스 연산자([:]) 사용하기

슬라이스 연산자의 두 피연산자는 각각 슬라이스의 시작 인덱스와 끝 인덱스를 의미합니다. 명시적으로 지정하지 않으면 시퀀스의 처음과 끝이 기본값으로 적용되는데, 이 특성을 활용하면 전체 리스트를 손쉽게 복사할 수 있습니다.

>>> L1 = [1,2,3,4]
>>> L2 = L1[:]
>>> L1
[1, 2, 3, 4]
>>> L2
[1, 2, 3, 4]
>>> id(L1)
185117025160
>>> id(L2)
185117171592

두 객체의 id가 서로 다르므로, L2는 완전히 새로운 리스트임을 확인할 수 있습니다.

2. 내장 함수 list() 사용하기

또 다른 방법은 파이썬의 내장 함수인 list()를 활용하는 것입니다. 기존 리스트를 인자로 넘기면 새로운 리스트 객체가 생성됩니다.

>>> L1 = [1,2,3,4]
>>> L2 = list(L1)
>>> L1
[1, 2, 3, 4]
>>> L2
[1, 2, 3, 4]
>>> id(L1)
185117295816
>>> id(L2)
185117209352

3. copy 모듈 사용하기 — 얕은 복사와 깊은 복사

파이썬 표준 라이브러리의 copy 모듈에는 객체를 얕은 복사(shallow copy)하거나 깊은 복사(deep copy)하는 함수가 포함되어 있습니다. 얕은 복사는 내부에 중첩된 리스트를 참조로만 복사하는 반면, 깊은 복사는 중첩 구조까지 모두 새롭게 복사한다는 점이 핵심 차이입니다.

>>> import copy
>>> L1 = [1,2,3,4]
>>> L2 = copy.copy(L1)
>>> L1
[1, 2, 3, 4]
>>> L2
[1, 2, 3, 4]
>>> id(L1)
185117025160
>>> id(L2)
185117295880
>>> L3 = copy.deepcopy(L1)
>>> L3
[1, 2, 3, 4]
>>> id(L3)
185117304328

얕은 복사와 깊은 복사의 차이

중첩 리스트를 다룰 때 두 방식의 차이가 명확하게 드러납니다.

>>> import copy
>>> original = [[1, 2], [3, 4]]
>>> shallow = copy.copy(original)
>>> deep = copy.deepcopy(original)
>>> original[0][0] = 100
>>> shallow
[[100, 2], [3, 4]]
>>> deep
[[1, 2], [3, 4]]

얕은 복사본인 shallow는 내부 리스트를 원본과 공유하기 때문에 원본 수정 시 함께 변경됩니다. 반면 깊은 복사본인 deep은 원본과 완전히 독립적입니다.

마무리

정리하면, 단순 대입(=)은 복사가 아니라 참조 공유입니다. 실제 복사가 필요하다면 슬라이스([:]), list(), copy.copy()(얕은 복사), copy.deepcopy()(깊은 복사) 중 상황에 맞는 방법을 선택하면 됩니다. 특히 중첩된 자료구조를 다룰 때는 깊은 복사를 사용하는 것이 안전합니다.