C/Java の背景を持つ python に移行して、最近相互再帰を実装する必要がありましたが、python の何かが気になりました:
Python プログラムは行ごとに解釈されるため、同じ Python ファイルに 2 つの関数が次々にある場合:
def A(n):
B(n-1)
# if I add A(1) here, it gives me an error
def B(n):
if n <= 0:
return
else:
A(n-1)
インタプリタが を読んでいるとき、A
はB
まだ定義されていませんが、このコードはエラーになりません
私の理解では、def
が解釈されると、python は を使用してローカル名前空間にエントリを追加しますlocals()
が{"function name": function address}
、関数本体に関しては、構文チェックのみを行います。
def A():
blabla # this will give an error
def B():
print x # even though x is not defined, this does not give an error
A() # same as above, NameError is only detected during runtime