dictionary 복사는 dict.copy() 메소드를 사용하는데, 이는 shallow copy 본을 return 한다.
# 과일 가격
fruits = {'apple':1000, 'banana':1200, 'pear':2000}
# shallow copy
fruits_copy = fruits.copy()
# 복사본에서 값을 수정
fruits_copy['apple'] = 4000
print(fruits_copy) # {'apple': 4000, 'banana': 1200, 'pear': 2000}
print(fruits) # {'apple': 1000, 'banana': 1200, 'pear': 2000}
# 원본에서 값을 수정
fruits['apple']=8000
print(fruits) # {'apple': 8000, 'banana': 1200, 'pear': 2000}
print(fruits_copy) #{'apple': 4000, 'banana': 1200, 'pear': 2000}
Python
복사
이렇게 복사본을 수정해도 원본에 반영이 되지 않는다. 만약 value값들이 list, tuple, set같은 다른 container object인 경우에는 어떨까
# 과일의 색과 가격
fruits = {'apple':['red', 1000],
'banana':['yellow', 1200],
'pear':['green', 2000]}
# shallow copyu
fruits_copy = fruits.copy()
# 복사본에서 apple의 색 변경
fruits_copy['apple'][0] = 'green'
print(fruits_copy)
# {'apple': ['green', 1000], 'banana': ['yellow', 1200], 'pear': ['green', 2000]}
print(fruits)
# {'apple': ['green', 1000], 'banana': ['yellow', 1200], 'pear': ['green', 2000]}
Python
복사
이 경우에는 복사본에 대한 수정이 원본에도 반영된다.
값이 복사가 되는 것이 아닌 fruits의 ‘apple’의 value값인 list 를 참조하고 있기 때문이다.
⇒ copy 모듈의 copy.deepcopy(x) 함수를 사용하면 이를 해결할 수 있다.
deep copy
import copy
fruits = {'apple':['red', 1000],
'banana':['yellow', 1200],
'pear':['green', 2000]}
# shallow copyu
fruits_deepcopy = copy.deepcopy(fruits)
# 복사본에서 apple의 색 변경fruits_copy['apple'][0] = 'green'
fruits_deepcopy['apple'][0] = 'green'
print(fruits_deepcopy)
# {'apple': ['green', 1000], 'banana': ['yellow', 1200], 'pear': ['green', 2000]}
print(fruits)
# {'apple': ['red', 1000], 'banana': ['yellow', 1200], 'pear': ['green', 2000]}
Python
복사
이렇게 deep copy본은 완전한 독립적인 복제본을 만들기 때문에 복사본을 수정해도 원본에 반영이 되지 않는다.
그 외
fruits_copy = fruits의 경우에는 복사본을 만드는 것이 아니라 동일한 딕셔너리를 가리키는 새로운 이름을 만드는 것 뿐이다. 따라서 fruits_copy를 수정하면 fruits에 반영이 된다.