ホームページ >バックエンド開発 >Python チュートリアル >Python 2 と Python 3 では、「exec」関数の動作はどのように異なりますか?
exec 関数は、Python 2 と Python 3 の間で異なる動作を示します。Python 2 では、exec はステートメントです。一方、Python 3 では、関数に移行しました。この違いは、ローカル変数との相互作用に重大な影響を及ぼします。
Python 2 では、exec ステートメントにより関数のスコープ内でローカル変数を変更できます。 exec ステートメントが実行されると、Python コンパイラーはローカル スコープの最適化を一時的に無効にし、ローカル変数とグローバル変数の両方にアクセスするために低速のルックアップ戦略に切り替えます。さらに、明示的なグローバルパラメータとローカルパラメータが指定されていない場合、exec ステートメント内で宣言された変数はすべて関数のローカルパラメータに自動的にコピーされます。
Python 3 では、exec()関数は関数スコープの規則に厳密に従います。変数が以前に宣言されていたとしても、関数のローカル スコープ内の変数を変更できなくなりました。 Locals() はローカル変数を一方向に反映できますが、locals() による変更はサポートされていません。
Python 2 で観察される望ましい動作を実現するには、 Python 3 で exec() を呼び出すときは、別の名前空間を利用する必要があります。カスタム辞書を exec() 関数に渡すことで、その名前空間内の変数を変更したり、変数にアクセスしたりすることができます。
次のコードは、Python 3 で exec() を使用する適切な方法を示しています。
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
このアプローチでは、関数のローカル スコープがそのまま維持されると同時に、関数内の変数の変更が可能になります。定義された名前空間。
以上がPython 2 と Python 3 では、「exec」関数の動作はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。