0

次のコードを検討してください。

aDict = {}    
execfile('file.py',globals(),aDict)
aDict['func2']() # this calls func2 which in turn calls func1. But it fails

そしてfile.pyにはこれが含まれています:

def func1():
    return 1

myVar = func1() # checking that func1 exists in the scope

func2 = lambda: func1()

これにより、「NameError: global name 'func1' is not defined 」というエラーが発生します。

ここで何が起こっているのかわかりません。file.py
のコードは、空のローカル名前空間で実行されます。 次に、そのコード内で新しい関数が定義され、すぐに正常に呼び出されます。つまり、関数はそのスコープに存在します。

では、なぜfunc1ラムダ内で呼び出せないのでしょうか?

他の言語では、ラムダ/クロージャーは、それらが定義されているスコープにバインドされます。
Pythonのルールはどうですか? それらはスコープにバインドされていますか? 名前空間に?

4

1 に答える 1

0

func1 が定義されている名前空間 (file.py の名前空間) がなくなっているため、再度参照することはできないと思います。これは醜いですが、 func1 が記憶されているコードです:

func2 = (lambda x: lambda : x())(func1)
于 2014-11-14T23:25:39.257 に答える