2012-11-03 47 views
2

我最近遇到了在Python中用函數定義函數的想法。我有這樣的代碼,它提供了錯誤:Python中的函數內的函數


def f1(a): 
    def f2(x): 
     return a+x 
    return 2*a 

錯誤:在調用f2(5)

Traceback (most recent call last): 
File "<pyshell#19>", line 1, in <module> 
f2(5) 
NameError: name 'f2' is not defined 

我有一些困難,瞭解全局變量在函數中使用的方法甚至在遞歸調用中。如果有人會指出我的錯誤,並且可能會幫助我,我會很感激。提前致謝 !!

+0

兩個downvotes?對我來說這似乎是一個合法的問題。 –

+0

@GraemePerrow:也許人們覺得這表明缺乏研究工作(我自己並沒有就此問題投票)。 –

回答

5

您在本地命名空間中定義了f2f1只有;它不是全球可用的。

如果你想這樣的嵌套函數可用在模塊級,你就必須要麼從函數返回,或者定義一個變量global將其存儲在:

def f1(a): 
    def f2(x): 
     return a+x 
    return 2*a, f2 

然後調用那如result, f2 = f1(somevariable_or_literal)

global的做法是不推薦(使用global很少是),但看起來是這樣的:

f2 = None 

def f1(a): 
    global f2 
    def f2_local(x): 
     return a+x 
    f2 = f2_local 
    return 2*a 

此時當你叫f1f2將被設置。

4

f2f1內定義。因此,它的範圍僅在功能f1內部擴展。在該空間之外,功能f2甚至不存在,這就是爲什麼你會收到錯誤。

如果您在f2被定義後從f1內部的某個地方撥打f2,它就會起作用。

Short Description of Python Scoping Rules對於範圍在Python中的工作原理有很好的解釋。