-
반응형
파이썬 딕셔너리(dictionary) 응용 편으로 복사하기에 대한 내용을 다룹니다.
● 딕셔너리 복사하기 ( copy )
파이썬에서 딕셔너리를 복사해서 사용하려면 대입하거나 copy 메소드를 사용합니다.
대입은 그냥 변수 명만 바뀌는 것이라고 생각하면 됩니다.
따라서 대입된 딕셔너리를 변경하면 원본 딕셔너리도 변경 됩니다.
보통 복사는 원본 변경없이 새로운 변수를 만들어 사용하려는 목적일 것입니다.
>>> dic = {'b': 2, 'c': [1, 5], 'd': 12}
## copy를 하여 새로운 변수를 만들어 줍니다.
>>> dic1 = dic.copy()
>>> dic1
{'b': 2, 'c': [1, 5], 'd': 12}
## 대입만 합니다. 사실상 변수명만 바뀐것입니다.
>>> dic2 = dic
>>> dic2
{'b': 2, 'c': [1, 5], 'd': 12}
## 주소값을 확인해 봅니다. dic2는 dic 과 주소 값이 일치합니다.
>>> id(dic)
1520208828480
>>> id(dic1)
1520208535808
>>> id(dic2)
1520208828480
## dic2 의 값을 변경하면 dic 에도 영향을 미쳤습니다.
>>> dic2['b'] = 10
>>> dic
{'b': 10, 'c': [1, 5], 'd': 12}
>>> dic1
{'b': 2, 'c': [1, 5], 'd': 12}
>>> dic2
{'b': 10, 'c': [1, 5], 'd': 12}
## dic1 값을 변경하면 dic1 만 영향을 미칩니다.
>>> dic1['b'] = 5
>>> dic
{'b': 10, 'c': [1, 5], 'd': 12}
>>> dic1
{'b': 5, 'c': [1, 5], 'd': 12}
>>> dic2
{'b': 10, 'c': [1, 5], 'd': 12}● 중첩 딕셔너리 복사하기 ( deepcopy )
중첩 딕셔너리도 복사하기가 되는지 확인해 봅니다.
중첩 딕셔너리는 { 키: {키 :값}, 키:{키:값}, … } 형식으로 정의 합니다.
예를 하나 들어 보겠습니다.
## deepcopy 함수를 사용하기 위해 import copy 합니다.
>>> import copy
## school 이라는 변수로 이중 중첩 딕셔너리를 선언합니다.
>>> school = {
'1반' : {
'학생수' : 25,
'반평균': 75.5,
'총점' : 1887
},
'2반' : {
'학생수' : 26,
'반평균': 80,
'총점' : 2000
},
'3반' : {
'학생수' : 25,
'반평균': 65,
'총점' : 1700
}
}## 중첩 원소 2반의 총점 입니다.
>>> school['2반']['총점']
2000
## c 변수는 copy 합니다.
>>> c = school.copy
>>> c
{'1반': {'학생수': 25, '반평균': 75.5, '총점': 1887}, '2반': {'학생수': 26, '반평균': 80, '총점': 2000}, '3반': {'학생수': 25, '반평균': 65, '총점': 1700}}
## d 변수는 deepcopy 합니다.
>>> d = copy.deepcopy(school)
>>> d
{'1반': {'학생수': 25, '반평균': 75.5, '총점': 1887}, '2반': {'학생수': 26, '반평균': 80, '총점': 2000}, '3반': {'학생수': 25, '반평균': 65, '총점': 1700}}
>>>
## copy 한 c의 2반 총점을 변경시 c와 school 모두 변경 되었습니다.
>>> c['2반']['총점'] = 10
>>> school
{'1반': {'학생수': 25, '반평균': 75.5, '총점': 1887}, '2반': {'학생수': 26, '반평균': 80, '총점': 10}, '3반': {'학생수': 25, '반평균': 65, '총점': 1700}}
>>> c
{'1반': {'학생수': 25, '반평균': 75.5, '총점': 1887}, '2반': {'학생수': 26, '반평균': 80, '총점': 10}, '3반': {'학생수': 25, '반평균': 65, '총점': 1700}}
## deepcopy 한 d의 2반 총점을 변경시 d만 변경 되었습니다.
>>> d['2반']['총점'] = 100
>>> d
{'1반': {'학생수': 25, '반평균': 75.5, '총점': 1887}, '2반': {'학생수': 26, '반평균': 80, '총점': 100}, '3반': {'학생수': 25, '반평균': 65, '총점': 1700}}
>>> school
{'1반': {'학생수': 25, '반평균': 75.5, '총점': 1887}, '2반': {'학생수': 26, '반평균': 80, '총점': 10}, '3반': {'학생수': 25, '반평균': 65, '총점': 1700}}
>>>파이썬의 딕셔너리 복사하는 법을 공부하였습니다.
copy는 얕은 복사( shellow copy), deepcopy는 깊은 복사( deep copy) 라고 하며. 불변형, 가변형 자료에 따라 변경 여부가 결정이 됩니다.
위 내용은 조금 어렵게 느껴질 수 있을것 같아 같이 기술하지는 않았지만 이런것이 있다 정도 알고 넘어가고 추후에 더 깊게 알아보시길 바랍니다.
반응형'IT 이야기 공간 > 프로그램 언어' 카테고리의 다른 글
파이썬 집합(set) 확인 메소드 (0) 2020.06.22 파이썬 집합(set) 메소드로 추가, 제거하기 (0) 2020.06.20 파이썬 딕셔너리 요소 추가 수정 삭제 방법 (0) 2020.06.18 파이썬 리스트 개수, 길이 구하기 (0) 2020.06.17 파이썬 리스트 정렬하기 (0) 2020.06.16