2014-04-17 41 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 

那麼,它的行爲不像打印計數()。爲什麼?

+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

謝謝。你說得很清楚。但我還有一個問題。當代碼計數=計數器(7)運行時。我認爲counter()函數應該已經完成​​了。所以訪問count [0]應該是非法的,對吧?那麼爲什麼count可以繼續訪問count [0]?在此先感謝 –

+0

@MingweiLi,這是因爲Python中的變量實際上是對象的引用,當沒有引用指向它們時,對象被刪除。 'counter()'返回一個函數,該函數在內部引用'counter()'調用創建的內部變量。只要函數返回生命,內部對象就會生存並可用。 –

0

,如果你想反的相同的行爲,並計數,然後按照下面的代碼:

>>> count = counter 
>>> print count(7) 
8 
>>> print count(7) 
8