2017-05-15 11 views
0

대 얕은 list.copy ...하지만 나는 매우 혼란 스러워요 : 워드 프로세서에서파이썬은 어쩌면 내가 얕은 복사의 정의를 이해하지 못하는 딥 카피

:

"S"는 어디에 목록 (그러나 동일한 질문은 각각 사전에 적용됩니다). 나는 s[:]는 딥 카피라고 생각

제외 : |

는 "s.copy는() ([]들과 동일) s의 단순 복사본을 만듭니다." 예를 들어 원래 버전을 가리 키지 않고 목록을 복사하는 방법은 this stack overflow answer을 참조하십시오. [:]

l1 = [1,2,3,4] 
l2 = l1[:] 
l3 = l1.copy() 



l2.append(5) 
l3[0] = 99 
print(l1) 
print(l2) 
print(l3) 
>> [1,2,3,4] 
>> [1,2,3,4,5] 
>> [99,2,3,4] 

l1, l2l3 모든 별도의 객체임을 나타납니다 그리고 list1.copy()를 사용하여뿐만 아니라 일명 동일한 동작을 깊은 복사를 할 것으로 보인다. 내가 뭘 놓치고 있니?

+0

... l1을 숫자 목록의 목록으로 변경하면 l1.copy()는 별도의 개체 – RSHAP

+1

을 생성하는 것처럼 보입니다. 둘 다 얕은 복사본입니다. 이 질문의 구별은 단순한 과제 (전혀 복사하지 않음)와 사본 (얕은 하나) –

+0

@ juanpa.arrivillaga 사이입니다. – RSHAP

답변

0

이 컨텍스트에서 "얕은"과 "깊은"의 의미를 오해했습니다.

얕은 복사본은 요소의 최상위 수준의 복사본입니다. 이러한 요소 중 하나라도 목록에 있으면 사본은 여전히 ​​원래 목록을 참조합니다. 이것은 l1[:]l1.copy() 모두입니다.

딥 복사본은 모든 수준의 복사본입니다. 목록의 요소 중 하나라도 깊이 복사됩니다. 참조는 공유되지 않습니다. 이것은 copy.deepcopy()입니다.

0

새 복사본에는 이전 목록과 동일한 개체에 대한 참조가 들어 있음을 의미합니다. 예를 들어

:

foo = [1, 2, []] 
bar = foo.copy() 
bar[-1].append(3) 
print(foo) 

우리는 bar에있는 개체의 돌연변이도 foo를 "오염"것을 볼 수 있습니다.

만약 우리가 다시 그것을 할 다른 이야기, 딥 카피를 사용하여이 예를 :

import copy 
foo = [1, 2, []] 
bar = copy.deepcopy(foo) 
bar[-1].append(3) 
print(foo) 

깊은 사본이 목록의 새로운 (전체 복사본)을 생성하는 대신 단지를 통해 복사하기 때문입니다 이전 목록을 참조하십시오.