ローカル変数を exec で直接更新できない方法
Python の exec 呼び出しは、コードを動的に実行するための強力なツールですが、ローカル変数の変更に関しては制限があります。
次の点を考慮してください。 code:
def f(): a = 1 exec("a = 3") print(a) f()
このコードでは 3 が出力されると予想されるかもしれませんが、実際には 1 が出力されます。これは、Python 3 ではローカル変数は辞書に格納されず、コンパイル時に決定されたインデックスを持つ配列に格納されるためです。時間。 exec 関数は、この最適化を妨げずにローカル変数を安全に変更できません。
解決策: exec でローカル ディクショナリを使用する
exec を使用してローカル変数を変更するには、以下が必要ですローカル辞書を明示的に渡します。例:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
これは、関数のローカル変数配列とは異なるローカル辞書 (ldict) 内のコードを実行します。変更された変数は、ローカル ディクショナリにアクセスすることで関数のスコープに戻すことができます。
Python 2 の動作
Python 2 では、exec は関数を渡さずにローカル変数を変更できました。これは、グローバル/ローカル引数なしで exec を使用する名前空間を「最適化されていない」ものとして扱ったためです。ただし、Python 3 ではこれは当てはまりません。
したがって、exec を使用する場合、コンパイラの最適化との潜在的な競合を避けるために、ローカル変数はローカル ディクショナリを作成して渡すことによってのみ更新できることに留意することが重要です。 .
以上がPython 3 で「exec」がローカル変数を直接更新できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。