アカウント名:
パスワード:
pythonの場合、関数定義は実行時まで評価されません。
def adef b
のタイミングで、シンボルaないしbに関数(実はオブジェクトへの参照)が代入されます。が、その時点では評価はされない (というよりも、aから見た global namespaceの'b'に何が代入されているか、動的に変更されるケースすらありうる) ので、実行時に参照が充足されればokです。
存在しない架空の文法で書くと
try: print a(); // この時点ではglobal namespaceに aは存在しない → errorexcept: pass
a = _(){ bを参照する関数定義 }; // 実行時評価b = _(){ aを参照する関数定義 };print a(); // ここでaの中身を実行すると、既にglobal namespaceにbがあるので、エラーなく相互参照が可能
てな感じだと思っていただければと。
追記ですが、関数もオブジェクトなのでフツーに代入とかできます。
def hoge(): print "hoge;def huga() print "huga";f=hogef() # → "hoge"f=hugaf() # → "huga"
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
最初のバージョンは常に打ち捨てられる。
関数定義は実行時まで評価されません (スコア:1)
pythonの場合、関数定義は実行時まで評価されません。
def a
def b
のタイミングで、シンボルaないしbに関数(実はオブジェクトへの参照)が代入されます。が、その時点では評価はされない (というよりも、aから見た global namespaceの'b'に何が代入されているか、動的に変更されるケースすらありうる) ので、実行時に参照が充足されればokです。
存在しない架空の文法で書くと
try:
print a(); // この時点ではglobal namespaceに aは存在しない → error
except:
pass
a = _(){ bを参照する関数定義 }; // 実行時評価
b = _(){ aを参照する関数定義 };
print a(); // ここでaの中身を実行すると、既にglobal namespaceにbがあるので、エラーなく相互参照が可能
てな感じだと思っていただければと。
Re:関数定義は実行時まで評価されません (スコア:1)
追記ですが、関数もオブジェクトなのでフツーに代入とかできます。
def hoge():
print "hoge;
def huga()
print "huga";
f=hoge
f() # → "hoge"
f=huga
f() # → "huga"