2012-03-08 4 views
10

저는 파이썬에 매우 익숙합니다. 아마도 매우 간단한 질문에 대해 미안합니다.파이썬 : list.remove와 혼동 됨

side=[5] 
eva=side 
print(str(side) + " side before") 
print(str(eva) + " eva before") 
eva.remove(5) 
print(str(side) + " side after") 
print(str(eva) + " eva after") 

이 수율 : 는

내가 문제를 설명하기 위해 내 코드를 단순화 (비록 내가 대답을 찾기 위해 지금 2 시간 소요)

[5] side before 
[5] eva before 
[] side after 
[] eva after 

을 왜 삭제 명령도 수행 목록 '측면'에 영향을 줍니까? 목록을 수정하지 않고 '측면'사본을 사용하려면 어떻게해야합니까?

당신에게

편집 대단히 감사합니다 : 좋은 및 이해 답변 주셔서 대단히 감사합니다!

+2

당신은 파이썬에서 이름에 대한 아이디어를 가지고 있습니다. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#python-has-names – GoingTharn

+1

@GoingTharn * 네임 스페이스 *는 전혀 다른 문제입니다. 그는 파이썬에 값 유형이 없다는 사실에 착수했습니다. (예, 다른 방법으로도 설명 할 수 있습니다. 그러나 "네임 스페이스"는 그 중 하나가 아닙니다). – delnan

+0

@delnan 동의; 나는 공포로 깨달았습니다. 나는 네임 스페이스를 작성하고 이름을 편집했습니다. Dusan의 (현재) 최고 투표 응답에있는 링크는 여하튼 나의 것보다 낫습니다. – GoingTharn

답변

13

파이썬에는 "사물"과 "사물의 이름"이 있습니다. 당신이

side = [5] 

를 쓸 때 당신은 새로운 일 [5] 만들고, 그것을 이름 side을 제공합니다. 그 다음 쓸 때

eva = side 

side의 새 이름을 지정하십시오. 과제는 물건에 이름을 붙이는 것입니다! 두 가지 이름이있는 [5] 한 가지만 있습니다.

새로운 것을 원하면 명시 적으로 요청해야합니다. 일반적으로 copy.copy(thing)을 사용하지만 목록의 경우 특별한 구문 thing[:]이 있습니다.

참고 : "물건"은 일반적으로 "개체"라고합니다. "이름"은 일반적으로 "참조"라고합니다.

+0

정답은 목록이 변경 가능하다는 것입니다! 다른 파이썬 객체 (Strings와 같은)는 이런 식으로 동작하지 않습니다 ... –

11

evaside은 같은 목록을 참조하십시오.

이 목록의 사본을 가지고 싶다면 : Python: copying a list the right way

편집을 :

eva = side[:] 

이 문서의 목록을 복사에 대한 자세한 내용을보실 수 있습니다을 그에게 유일한 방법은 아니다 사본 목록. 이 답변의 첫 번째 의견에 게시 된 링크를 참조하십시오.

+4

http://stackoverflow.com/questions/2612802/how-to-clone-a-list-in-python/2612815#2612815에 대한 훌륭한 답변도 있습니다. –

+0

또는 eva = list (side) – jgritty

1

dusan's 대답은 정확하고 똑똑한 접근이지만, 나는 그것이 파이썬 지침의 Zen of 을 "Explicit is implicit"라고 부릅니다.

나는 훨씬 더 일반적인 패턴을 확인하기 위해 아이템을 확인한 후 copy 모듈을 사용하고 있습니다.

>>> import copy 
>>> eva = copy.copy(side) 
+4

에서 Explicitness 가이드 라인을 어기 지 않는다고 생각합니다. _explicitly_ 복사 중입니다! 불투명 한 구문 일 수도 있습니다. – katrielalex

+4

또한'copy.copy'는'copy.deepcopy'가 아니라'[:]'와 같은 역할을합니다. – katrielalex

+0

두 가지 경우가 서로 다른 경우입니다. 항상 목록에있는 항목의 사본을 만들고 싶지는 않습니다. – Darthfett