2012-11-11 3 views
3

파이썬의 del 문은리스트에 적용될 때 매우 이상합니다. 해당 목록의 항목을 삭제할뿐만 아니라 변수가 파생 된 모든 목록에서 동일한 요소를 삭제하기위한 "백 트랙"도 삭제합니다. 예를 들어파이썬 델 함수의 "역 추적"변수

: 즉

>>> x 
[1, 2, 3, 4, 5] 
>>> z=x 
>>> del z[1] 
>>> z 
[1, 3, 4, 5] 
>>> x 
[1, 3, 4, 5] 

, 내가 z에 삭제를 적용하더라도이 삭제도 x에 적용됩니다. 이 "역 추적"은 다른 명령이나 기능을 제공하지 않습니다.

>>> x=[1,2,3,4,5] 
>>> z=x 
>>> z+[6] 
[1, 2, 3, 4, 5, 6] 
>>> x 
[1, 2, 3, 4, 5] 

z 잎 x에 add 함수를 적용하면 매우 효과적입니다.

이것은 제가 작업하고있는 'NA'삭제 스크립트로 여러 가지 두통을 불러 일으 킵니다. del 문에 어떤 일이 발생하는지 알고 있습니까?이 문제를 해결하려면 어떻게해야합니까? z=x을 설정하고 z에 del을 적용하면 x은 변경되지 않습니다.

+1

:

다음 방법 중 하나를 사용하여 목록을 복사 할 수 있습니다 -have-variables – FogleBird

답변

9

z = x은 목록을 복사하지 않습니다. z와 x는 이제 같은 목록을 가리 킵니다. 해당 목록의 수정 사항은 이름 z 및 x를 통해 볼 수 있습니다.

z + [6]으로 결과를 z에 다시 할당하지 않았습니다. 그렇게 한 후 z을 인쇄 해보십시오. x처럼 변경되지 않습니다.

z += [6]은 결과를 z에 다시 지정하는 데 필요하며 첫 번째 예와 동일한 동작을합니다. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages이 읽기

z = x[:] 
z = list(x) 
+0

닫기, 그러나'z + = [6]'과'z = z + [6]'사이에는 중요한 차이가 있습니다. – Miles

+0

@Miles'z + = [6]'과'z = z + [6]'의 차이점은 무엇입니까? 똑같은 것 같습니다. 내가 놓친 게 있니? – miki725

+0

@ miki725 :'z + = [6]'은'list'에 대한 in-place 연산입니다. 'z + [6]'는 새로운'list'를 만듭니다. – eryksun

관련 문제