프로그래밍 언어/Python

dict.copy () 이해- shallow or deep?

Rateye 2021. 8. 30. 10:49
728x90
반응형
질문 : dict.copy () 이해-얕거나 깊습니까?

dict.copy() 대한 문서를 읽는 동안 사전의 얕은 사본을 만든다고합니다. 내가 따르는 책 (Beazley의 Python Reference)도 마찬가지입니다.

m.copy () 메서드는 매핑 개체에 포함 된 항목의 얕은 복사본을 만들고 새 매핑 개체에 배치합니다.

이걸 고려하세요:

>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}

original 의 값을 업데이트 할 것이라고 가정했습니다 (그리고 'c': 3 추가). 목록을 위해 수행하는 것처럼 :

>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])

이것은 예상대로 작동합니다.

둘 다 얕은 복사본이기 때문에 dict.copy() 가 예상대로 작동하지 않는 이유는 무엇입니까? 아니면 얕은 복사와 깊은 복사에 대한 나의 이해에 결함이 있습니까?

답변

"얕은 복사" 는 사전의 내용 이 값으로 복사되지 않고 단지 새로운 참조를 생성한다는 것을 의미합니다.

>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

반대로 전체 복사는 모든 내용을 값별로 복사합니다.

>>> import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

그래서:

  1. b = a : 참조 할당, ab 가 동일한 객체를 가리 킵니다. 'a = b': 'a'와 'b'는 모두 '{1 : L}'를 가리키고 'L'은 '[1, 2, 3]'을 가리 킵니다.
  2. b = a.copy() : 얕은 복사, ab 는 두 개의 분리 된 객체가되지만 그 내용은 여전히 동일한 참조를 공유합니다. 'b = a.copy ()'그림 : 'a'는 '{1 : L}', 'b'는 '{1 : M}', 'L'및 'M'은 모두 '[ 1, 2, 3] '.
  3. b = copy.deepcopy(a) : 깊은 복사, ab 의 구조와 내용이 완전히 분리됩니다. 'b = copy.deepcopy (a)'예시 : 'a'는 '{1 : L}'을 가리키고, 'L'은 '[1, 2, 3]'을 가리 킵니다. 'b'는 '{1 : M}'을 가리키고 'M'은 '[1, 2, 3]'의 다른 인스턴스를 가리 킵니다.

 

출처 : https://stackoverflow.com/questions/3975376/understanding-dict-copy-shallow-or-deep
728x90
반응형