2014-12-25 2 views
2

파이썬이 어떻게 변이 형 사본을 처리하는지 이해했다고 생각했지만 다음과 같은 문제가 발생했습니다. 리스트의 복사본을 변경하여 원본을 수정 함

x = [i for i in xrange(5)] 
mylist = [x, x] 

mylist_copy = mylist[:] 

mylist_copy[0].pop() 

mylist 

Out : [[0, 1, 2, 3], [0, 1, 2, 3]] 

는 그래서 mylist 변경 만 mylist_copy에 만들어지고에도 불구하고 변경되었습니다 보인다. 이 문제가 발생하지 않도록 어떻게 mylist의 순수한 복사본을 만들 수 있습니까?

답변

3

복사 하시겠습니까? 복사본이 있습니다. : mylist_copy에는 원본 x에 대한 참조가 포함되어 있습니다.

딥 복사하려면 copy.deepcopy()을 사용하십시오.

1

mylist_copy을 만들 때 복사 오류가 발생하지 않고 mylist이 두 개의 동일한 요소로 구성되어 있기 때문에 발생합니다.

In [80]: x = [i for i in range(5)] 

In [81]: mylist = [x, x[:]] 

In [82]: mylist_copy = mylist[:] 

In [83]: mylist_copy[0].pop() 
Out[83]: 4 

In [84]: mylist 
Out[84]: [[0, 1, 2, 3], [0, 1, 2, 3, 4]] 
:

In [70]: x = [i for i in range(5)] 

In [71]: mylist = [x,x] 

In [72]: mylist 
Out[72]: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]] 

In [73]: mylist[0].pop() 
Out[73]: 4 

In [74]: mylist 
Out[74]: [[0, 1, 2, 3], [0, 1, 2, 3]] 

다음은이 문제를 회피하는 한 가지 방법이있다 : 결과

mylist = [x,x] adds two references to the same object (`x`). 

, mylist[0].pop() 같은 결과를해야합니다
관련 문제