0

このサンプルコードのようなものがあるとします。

def foo(n):
   def bar():
      return -1
   if n = 0:
      return 0
   else:
      return foo(n+bar())

foo が再帰的に呼び出されるたびに、 bar の新しいインスタンスを作成すると仮定します。ただし、これは python (または他の言語) で最適化できるもののように見えますが、最適化されているかどうかを示すものは見つかりませんでした。

foo でバーを定義している理由は、バーをユーザーから隠そうとしていることと、Python の _bar() または __bar() の「この親愛なるユーザーを使用しないでください」が、非スクリプトで訓練されているため、私を悩ませていることです。言語。

4

1 に答える 1

2

defは Python で実行可能なステートメントです (そして もそうですclass)。が呼び出されるbarたびに新しい関数オブジェクトが作成されますが、コストはごくわずかです。foo()コンパイルされたコード オブジェクトを取得し、それを新しい関数オブジェクトにラップするだけです。人々はこれを強調しすぎます ;-) 一般に、クロージャーが正しく機能し、適切なデフォルト引数を取得するには、これを行う必要があります。多くの場合、これは少し最適化される可能性がありますが、CPython の実装は気にしません。

于 2013-11-06T04:35:25.927 に答える