2013-10-08 7 views
2

나는 다음과 같은 코드가 있습니다이상한 목록 동작

d = [1,2,3,4] 
dpop = d.pop 
d = ["A","B","C"] 
dpop() # return 4 
d.pop() #return C 

그럼, 왜 내 첫 번째 목록이 여전히 존재를? 어디?

+1

파이썬의 변수 이름은 개체에 붙이는 레이블 일뿐입니다. C. –

답변

8

첫 번째 목록은 dpop이 가리키는 메서드 개체에 대한 참조가 유지되므로 첫 번째 목록이 존재합니다.

기본적으로, 당신이했던 것은 이것이다 :

dpop = [1,2,3,4].pop 

당신은 당신이 처음에했던 목록의 인스턴스와 관련된 dpop에 저장 한 pop 방법의 예 (당신은 할 수 dpop.__self__에서 찾으십시오.)

+1

s/function/method/g 에서처럼 메모리의 고정 된 공간을 참조하지 않습니다. –

+4

'dpop'는 바운드 메소드입니다. 원래 목록은'dpop .__ self__'를 통해 접근 할 수 있습니다. –

+0

앰버, @SvenMarnach 좋은 흥미로운 대답! –

2

boundmethod 개체에 대한 참조를 유지합니다. 개체 자체는 인스턴스에 대한 참조를 유지합니다. cf https://wiki.python.org/moin/FromFunctionToMethod 파이썬 메소드가 실제로 무엇인지 더 알고 싶습니다.