Python에서 목록을 복사하는 방법(얕은 복사와 깊은 복사)
Python에서 목록을 복사하는 방법을 알아보세요. 목록 분할, copy() 메서드, 목록 생성자를 살펴보고 얕은 복사본과 깊은 복사본의 차이점을 마스터하세요.
개요
Python에서 목록은 변경 가능한 객체이며 변수는 실제 값이 아닌 메모리에 이러한 객체에 대한 참조를 보유합니다. 즉, 새 변수에 목록을 할당하면(예: `list_b = list_a`) 두 변수 모두 정확히 동일한 목록을 참조합니다. `list_b`를 통해 수정된 내용은 `list_a`에 즉시 영향을 미칩니다. 이러한 부작용을 방지하려면 목록의 명시적인 복사본을 만들어야 합니다.
Python은 목록의 얕은 복사본을 만드는 여러 가지 방법을 제공합니다. 단순 복사본은 원본 목록에서 찾은 요소에 대한 참조를 포함하는 새 목록을 구성합니다. 일반적인 방법에는 내장 목록 `.copy()` 메서드 사용, 목록 분할 `list_a[:]` 사용, 목록을 `list()` 생성자에 전달하는 것이 포함됩니다. 이들 모두는 새로운 목록 컨테이너를 생성하므로 요소를 독립적으로 추가하거나 제거할 수 있습니다.
그러나 목록에 중첩된 변경 가능한 개체(예: 목록 또는 사전)가 포함된 경우 얕은 복사본은 외부 컨테이너만 복제합니다. 중첩된 객체는 공유된 상태로 유지됩니다. 복사본에서 중첩 목록을 수정하면 원본 목록이 변경됩니다. 이를 방지하려면 계층 구조 내의 모든 객체를 재귀적으로 복제하는 `copy` 모듈의 `deepcopy()` 함수를 사용하여 전체 복사를 수행해야 합니다.
코드 및 실행 출력
이 코드는 참조 할당 트랩, list.copy()를 사용한 얕은 복사, 복사 모듈을 사용한 중첩 목록의 깊은 복사를 보여줍니다.
import copy
# 1. The assignment reference trap (Not a copy!)
original = [1, 2, 3]
reference = original
reference.append(99)
print("Reference modification affects original:", original)
# Reset list
original = [1, 2, 3]
# 2. Creating a shallow copy (using list.copy())
shallow_copy = original.copy()
shallow_copy.append(100)
print("\nOriginal:", original)
print("Shallow copy:", shallow_copy)
# 3. The nested list limitation of shallow copies
nested = [[1, 2], [3, 4]]
shallow_nested = nested.copy()
shallow_nested[0].append(99) # Modifying nested list
print("\nOriginal nested:", nested)
print("Shallow nested copy:", shallow_nested)
# 4. Creating a deep copy
nested_original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_original)
deep_copy[0].append(99)
print("\nOriginal nested:", nested_original)
print("Deep copy (completely independent):", deep_copy)Reference modification affects original: [1, 2, 3, 99]
Original: [1, 2, 3]
Shallow copy: [1, 2, 3, 100]
Original nested: [[1, 2, 99], [3, 4]]
Shallow nested copy: [[1, 2, 99], [3, 4]]
Original nested: [[1, 2], [3, 4]]
Deep copy (completely independent): [[1, 2, 99], [3, 4]]단계별 구현
- 단순 목록 구조의 얕은 복사본을 만들려면 my_list.copy() 또는 my_list[:]를 사용하세요.
- 독립적인 컬렉션이 필요한 경우 copy_list = my_list와 같은 참조 할당을 피하세요.
- 복사 모듈을 가져오고 중첩된 변경 가능 구조가 포함된 목록에 대해 copy.deepcopy(my_list)를 사용하십시오.
- 성능과 메모리 공간을 최적화하려면 데이터 구조를 이해해야 합니다.
자주 묻는 질문
얕은 복사본과 깊은 복사본의 차이점은 무엇입니까?
얕은 복사본은 가장 바깥쪽 컨테이너를 복사하지만 중첩된 변경 가능한 개체를 참조합니다. 전체 복사는 중첩된 모든 컨테이너와 개체를 반복적으로 복제하여 완전히 격리된 데이터 구조를 만듭니다.
목록 분할(list[:])이 list.copy()보다 더 빠릅니까?
둘 다 내부적으로 최적화된 C 작업을 실행하므로 성능이 사실상 동일합니다. 가독성을 위해 일반적으로 list.copy()를 사용하는 것이 좋습니다.
관련 주제
권장 Python 리소스
관련 대화형 튜토리얼, 치트 시트, 코드 비교를 통해 지식을 확장하세요.
Python 변수 및 데이터 유형 설명
Python 변수와 핵심 데이터 유형(문자열, 정수, 부동 소수점, 부울)을 이해합니다. Python의 메모리 할당에 대한 완전한 초보자 가이드입니다.
Python 목록 메서드 치트 시트
Python 목록 작업에 대한 빠른 참조 가이드입니다. 요소 추가, 삽입, 제거, 정렬 및 분할을 마스터합니다.
Python 대 JavaScript: 어떤 프로그래밍 언어가 가장 좋나요?
Python과 JavaScript를 포괄적으로 비교합니다. 구문 차이점, 성능, 사용 사례(백엔드와 프런트엔드) 및 코딩 예제를 살펴보세요.