exec のローカル変数への影響: 詳細
動的コード実行の Python の定番である exec 関数は、興味深いクエリを提示します。関数内のローカル変数を更新できますか?
Python 3 のジレンマ
Python 3 では、次のコード スニペットは予想どおりローカル変数の更新に失敗します。
def f(): a = 1 exec("a = 3") print(a)
予想される '3' ではなく、驚くべきことに、 '1' を出力します!
Python 2動作
興味深いことに、Python 2 の同じコードは確かにローカル変数を更新し、「3」を出力します。この相違は、Python がローカル変数を処理する方法の根本的な変更から生じています。
ローカルのジレンマ
Python 2 とは異なり、Python 3 は最適化された固定配列にローカル変数を格納します。コンパイル時に。この効率性は、ローカルへの実行時の変更を禁止するという代償を払って実現されます。したがって、Python 3 のデフォルトの exec 呼び出しではローカル変数を正常に変更できません。
The Magic of Locals()
この制限を回避してローカル変数を更新するには、次のようにする必要があります。ローカル辞書を exec に明示的に渡します。このディクショナリには、動的コードの実行後に更新されたローカル変数が保存されます。修正されたコードは次のようになります。
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Exec() の影響
Python 3 のドキュメントでは、exec の使用中にデフォルトの locals() 辞書を変更しないように明示的に警告しています。 、これは予期しない動作につながる可能性があるためです。安全のため、ローカル変数を更新する場合は、常に明示的なローカル辞書を exec に渡す必要があります。
The Curious Optimizations of Python
Python に関する Georg Brandl の洞察力に富んだコメントバグレポートは、Python 3 のローカル変数の最適化が現在の動作につながったことを強調しています。コンパイラは、カスタム実行関数と Python 独自の実行関数を区別できないため、特別な処理を提供できません。したがって、デフォルトの exec はローカルを変更できません。
Python 2 の例外
Python 2 では、古い exec ステートメントは異なる動作をしました。コンパイラによる組み込み exec の特別な処理により、ローカル変数を動的に変更できるようになりました。
結論
Python 3 の exec 呼び出しには、微妙な変更が必要です。ローカル変数を変更するアプローチの変更。明示的なローカル辞書を採用することで、開発者はローカル変数の制御を維持しながら、動的コード実行の力を活用できます。
以上が`exec()` は Python 3 のローカル変数を更新しますか?更新しない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。