0

レコードごとに関数を定義する動的なPythonサービスがあり、よくわからないことがありました。次のようにテストプログラムを設定したとします。

func_str = """
def func():
  print "top"
"""
exec func_str

func_str = """
def func():
  print "bottom"
"""
exec func_str

func()

もちろん、これは、最初の"bottom"呼び出しをexec func_str上書きする2番目の呼び出しとして出力されます。ボンネットの下で何が起こるのか興味があります。最初の関数定義は何らかの方法で削除されていますか?

4

2 に答える 2

5

関数本体がコンパイルされ、変数名でローカル名前空間に割り当てられますfunc

次に2番目のステートメントを実行するとexec、新しい関数が同じ名前で保存され、最初のステートメントが上書きされます。最初のものへの参照を新しい名前で保存することにより、最初のものを保持できます。

foo = func

したがって、後でそれをまだ次のように参照できますfoo

foo()

辞書、リスト、または別のオブジェクトの属性として保存することもできます。

于 2012-09-05T20:14:46.960 に答える
2

これと同じです:

>>> a = 5
>>> print a
5
>>> a = 'hello'
>>> print a
'hello'

つまり、関数を名前(この場合はfunc)に割り当てるだけで、その後の呼び出しで同じ名前のfuncを別の関数に再割り当てします。

于 2012-09-05T20:16:24.530 に答える