Python で exec を使用してローカル変数を更新する方法
Python の exec 関数を使用すると、コードを実行時に動的に実行できます。ただし、exec を使用してローカル変数に値を割り当てると、特定の動作が予期しない場合があります。
Python 3 の問題
Python 3 では、次のコードは 1 を出力します。予想される 3 の代わりに:
def f(): a = 1 exec("a = 3") print(a) f()
これは、Python 3 では exec 関数がデフォルトであるためです。グローバル名前空間を変更します。ローカル変数を変更するには、明示的なローカル辞書を提供する必要があります。
Python 3 での解決策
Python 3 で exec を使用してローカル変数を更新する正しい方法は次のとおりです。
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Python 2 と Python 3動作
Python 2 では、元のコードは exec 関数がローカル名前空間を変更することを前提としていたため、期待どおりに動作しました。ただし、Python 3 では、最適化の目的でこの動作が変更されました。
技術的な詳細
Python 3 では、通常、ローカル変数は辞書ではなく配列に格納されます。この最適化により、ローカル変数の辞書を維持するオーバーヘッドが防止されます。ただし、ローカル変数を直接変更する exec の機能も制限されます。
明示的なローカル辞書を提供することにより、exec 関数はその名前空間でコードを実行するように指示され、ローカル変数を更新できるようになります。
結論
Python 3 の exec を使用してローカル変数を更新するには、明示的なローカル辞書を提供する必要があります。これにより、変更が正しい名前空間で行われることが保証され、予期しないコードの動作が防止されます。
以上がPython の「exec」関数でローカル変数を正しく更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。