Search

dictionary의 복사

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에 반영이 된다.