2016-09-01 4 views
1

나는 목록의 사본을 만들려고했다. (문자 그대로 원본과 아무 ​​것도 공유하지 않는 분리 된 복제본). copy.copy()를 사용하여 2 개의 분리 목록을 만들었지 만 각 복사본의 요소가 왜 공유되는 것처럼 보입니까?Python - copy.copy()의 요소는 여전히 원래 메모리와 메모리를 공유합니까?

설명하기가 어렵습니다. 다음 출력을 확인하십시오.

>>> a = [[0,1], [2,3]] 
>>> import copy 
>>> b = copy.copy(a) 
>>> temp = b.pop() 
>>> temp 
[2, 3] 
>>> a 
[[0, 1], [2, 3]] 
>>> b 
[[0, 1]] 
>>> temp.append(4) 
>>> temp 
[2, 3, 4] 
>>> a 
[[0, 1], [2, 3, 4]] 
>>> b 
[[0, 1]] 

이 보시다시피, 온도B에서 튀어되고, 아직 내가 온도을 변경하는 경우 (일명 새로운 물건을 추가)는 의 데이터는도 변경.

내 질문은 : 이것은 deepcopy의 예상되는 동작입니까? 그러면 목록의 사본을 어떻게 완전히 분리 할 수 ​​있습니까?

P/S가 : 위의 예를 들어, 내가
temp = copy.copy(b.pop())
을 할 수 있지만, 이것은 적절한 방법 것 같다? 내가 원하는 것을 할 수있는 다른 방법이 있습니까?

는 P/S 2 : I가 B를 사용하는 경우에도 일어난다 = A [:]

감사합니다

+2

사용에 대한 링크를 참조하시기 바랍니다'대신 copy.deepcopy'. 'copy.copy'는 얕은 사본만을 만듭니다. 즉, 하나의 "layer"목록 만 복사합니다. 자세한 내용은 [here] (http://stackoverflow.com/q/17873384) 및 [here] (http://stackoverflow.com/q/2612802)를 참조하십시오. –

+0

감사합니다. 작동합니다! 나는 실제로 copy()가 그들이 문서에서 말한 deepcopy라고 생각했다. –

답변

2

친화적 인 개이 OP 아래에 주석으로 달아져 deepcopy()를 사용하도록 제안되었습니다. 그것은 작동합니다. 감사!

1

copy.copy()은 얕은 복사입니다. 즉, 복사 된 것과 동일한 새 오브젝트가 작성됩니다. 그러나 복사 된 오브젝트 내의 요소는 작성되지 않았고 참조도됩니다. 복사가()는 (그 내부의 객체)는 전체 개체를 원하는 계세요하지만 내부의 개체를하지 참조하는 개체의 얕은 복제를 만들기 때문에 -> a = [[0,1], [2,3]] -> import copy -> b = copy.copy(a) # the b be created, but [0,1] [2,3] still are reference -> temp = b.pop() -> temp [2, 3] -> a [[0, 1], [2, 3]] -> b [[0, 1]] -> temp.append(4) -> temp [2, 3, 4] -> a [[0, 1], [2, 3, 4]] -> b [[0, 1]] Docs

관련 문제