728x90
반응형
개요
Python에서 딕셔너리(dict ; dictionary) 객체를 복사할 때 알아야 할 세 가지 복사 방법을 상호 비교 정리해 둡니다.
일반 복사 (참조 복사)
등호 ('=') 기호를 통하여 딕셔너리 객체의 참조를 다른 변수에 참조만 그대로 복사합니다.
따라서 두 객체는 완전히 동일합니다.
original_dict = {'a': 1, 'b': [1, 2, 3]}
copy_dict = original_dict
# 값 변경 시 원본도 함께 변경됨
copy_dict['a'] = 10
print(original_dict) # {'a': 10, 'b': [1, 2, 3]}
print("원본 딕셔너리 ID:", id(original_dict))
print("참조 복사 딕셔너리 ID:", id(ref_copy))
print("딕셔너리 동일 여부:", original_dict is ref_copy) # True
두 객체 변수 모두 동일한 참조를 가리키므로, 값을 변경하면 양쪽 모두에서 변경된 것처럼 보입니다.
얕은 복사 (Shallow Copy)
1차 레벨 딕셔너리 객체는 새로 생성하여 복제하고, 내부에 중첩된 객체들은 원본 딕셔너리와 참조를 공유합니다.
copy.copy() 함수를 이용합니다.
import copy
original_dict = {'a': 1, 'b': [1, 2, 3]}
shallow_copy = copy.copy(original_dict)
# 1차 레벨 값 변경 시 원본에 영향 없음
shallow_copy['a'] = 10
print(original_dict) # {'a': 1, 'b': [1, 2, 3]}
# 중첩된 리스트 변경 시 원본도 함께 변경됨
shallow_copy['b'][0] = 100
print(original_dict) # {'a': 1, 'b': [100, 2, 3]}
print("원본 딕셔너리 ID:", id(original_dict))
print("얕은 복사 딕셔너리 ID:", id(shallow_copy))
print("딕셔너리 동일 여부:", original_dict is shallow_copy) # False
print("내부 리스트 ID 비교:")
print("원본 리스트 ID:", id(original_dict['b']))
print("얕은 복사 리스트 ID:", id(shallow_copy['b'])) # 같은 ID
깊은 복사 (Deep Copy)
딕셔너리 내부의 모든 중첩된 객체까지 완전히 새로 생성하고 원본의 정보를 그대로 복제합니다.
copy.deepcopy() 함수를 이용합니다.
import copy
original_dict = {'a': 1, 'b': [1, 2, 3]}
deep_copy = copy.deepcopy(original_dict)
# 모든 중첩된 객체까지 완전히 독립적으로 복사
deep_copy['a'] = 10
deep_copy['b'][0] = 100
print(original_dict) # {'a': 1, 'b': [1, 2, 3]}
print(deep_copy) # {'a': 10, 'b': [100, 2, 3]}
print("원본 딕셔너리 ID:", id(original_dict))
print("깊은 복사 딕셔너리 ID:", id(deep_copy))
print("딕셔너리 동일 여부:", original_dict is deep_copy) # False
print("내부 리스트 ID 비교:")
print("원본 리스트 ID:", id(original_dict['b']))
print("깊은 복사 리스트 ID:", id(deep_copy['b'])) # 다른 ID
결론
위와 같이 딕셔너리 객체를 복사할 때, 각 방법간의 차이가 있습니다.
이를 정확하게 이해하고 상황에 맞는 복사 방법을 이용하도록 해야겠습니다.
'프로그래밍 > Python' 카테고리의 다른 글
[python] struct.error: char format requires a bytes object of length 1 (0) | 2024.06.22 |
---|---|
[python] 명령줄 인자 분석 - argparse.ArgumentParser (0) | 2024.06.20 |
[python] TypeError: argument 'data': 'memoryview' object cannot be converted to 'PyBytes' (0) | 2024.06.19 |
[python] LM73 TI 온도센서에서 온도값 읽어오기 (0) | 2024.06.10 |
[opencv] 종횡비 고정하여 이미지 크기 조정하기 (0) | 2024.06.01 |