2012-11-22 78 views

回答

5

在你的情況下,它是不需要的,因爲another_fun嵌套到其他功能,因此它捕獲從該函數的局部名字,這包括self。實際上,從some_fun可訪問的任何名稱也可從another_fun訪問。

這就是一些人所說的關閉,編寫創建函數的函數很棒。典型的例子是:

def MultiplyBy(x): 
    def M(y): 
     return x * y 
    return M 

Double = MultiplyBy(2) 
Triple = MultiplyBy(3) 

print Double(10), Triple(10) 

這將打印20 30

+0

謝謝,現在我知道什麼是閉包 – dtc

2

是的,當你在另一個函數中定義一個函數時,內部函數可以從外部函數讀取變量。這不是特定於self。它適用於在所有功能的全部變量:

>>> def outer(): 
...  a = 2 
...  def inner(): 
...   print a 
...  inner() 
>>> outer() 
2 

在Python 2,則不能重新綁定外變量在內部函數(即,可以不做a = 3上述內部inner)。在Python 3中,您可以使用nonlocal聲明來執行此操作。

但是,你爲什麼要這樣做?首先,上面的代碼甚至不會調用another_fun,所以它所做的並不重要。一般來說,在其他函數中定義函數有點奇怪。這樣做肯定有合法的情況(例如裝飾者),但在很多情況下,這可能會造成混淆。

+1

實際上,裝飾者是合法的,並引起混淆。 – rodrigo

+0

@rodrigo:我沒有說這兩種情況是相互排斥的:-) – BrenBarn

+0

沒有特別的理由這樣做,只是碰巧在改變一些代碼時偶然發生了。謝謝你的迴應 – dtc

相關問題