2014-04-17 1 views
-5
>>> def counter(start_at=0): 
...  count = [start_at] 
...  def incr(): 
...    count[0] += 1 
...    return count[0] 
...  return incr 
... 
>>> count = counter(7) 
>>> print count() 
8 
>>> print count() 
9 

위의 코드는 정상적으로 실행되고 있습니다. 이해 했어. 하지만 아래 코드는 위와 같아야한다고 생각했습니다.코드가 이상합니다.

>>> counter(7)() 
8 
>>> counter(7)() 
8 

글쎄, 그것은 print count()처럼 행동하지 않습니다. 왜?

+2

-1 제목, http://msmvps.com/blogs/jon_skeet/archive/2010/08를 참조하시기 바랍니다 /29/writing-the-perfect-question.aspx – reto

답변

1

이 이유는 모든 counter(7) 호출은 count 인스턴스를 별도로 만들고 incr 함수를 분리하기 때문입니다. 호출 할 때 실제로 다른 변수 count을 참조하므로 결과는 위에 표시된 것과 같습니다.

+0

감사합니다. 너는 그것을 아주 분명하게했다. 하지만 또 다른 질문이 있습니다. code count = counter (7)가 실행될 때. counter() 함수는 이미 완료되어야한다고 생각합니다. count [0]에 대한 액세스가 불법이어야합니다. 맞습니까? 그러면 왜 카운트가 카운트 [0]에 계속 액세스 할 수 있습니까? 미리 감사드립니다 –

+0

@MingweiLi, Python의 변수는 실제로 객체에 대한 참조이므로 객체 참조가 없기 때문에 객체가 제거됩니다. 'counter()'는 내부에서'counter()'호출로 생성 된 내부 변수를 참조하는 함수를 반환합니다. 반환 된 함수가 살아있는 한, 내부 객체는 살아 있고 사용할 수 있습니다. –

0

당신이 카운터의 같은 행동을 할 다음 코드 아래의 사항을 지켜 카운트 경우 :

>>> count = counter 
>>> print count(7) 
8 
>>> print count(7) 
8 
관련 문제