問題:
Python 3 で exec を使用して実行する場合関数内のコード文字列の場合、関数内のローカル変数は更新されません。この問題は、Python 3 のローカル変数ストレージの効率的な最適化が原因で発生します。
例:
def f(): a = 1 exec("a = 3") print(a) f()
このコードは 3 を出力することが期待されていますが、代わりに出力されます。 1.
解決策:
exec を使用してローカル変数を変更するには、明示的なローカル ディクショナリを渡す必要があります。これは次のようにして実現できます:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
説明:
Python 3 は、アクセスを最適化するためにローカル変数を配列に格納します。ただし、exec のデフォルトの動作では、ローカル変数の変更は許可されていません。明示的なローカル ディクショナリを渡すことで、変数をディクショナリに割り当てることができ、そのディクショナリを通じてその変更された値にアクセスできます。
Python 2 と Python 3:
Python 2 では、exec を使用する関数が最適化されていないローカル変数ストレージを持つことを許可する最適化メカニズムにより、この動作は期待どおりに機能しました。ただし、Python 3 では、この最適化は不可能になり、観察された動作が発生します。
注:
明示的なローカル ディクショナリを渡す場合は、次のことを行う必要があることを覚えておくことが重要です。 Python 3 のデフォルトのローカル変数処理によってもたらされる最適化の利点が失われるため、必要な場合にのみ実行してください。
以上がPython 3 で exec がローカル変数を更新しないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。