ホームページ >バックエンド開発 >Python チュートリアル >Python 2 と Python 3 では、「exec」関数の動作はどのように異なりますか?

Python 2 と Python 3 では、「exec」関数の動作はどのように異なりますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 15:07:01633ブラウズ

How does the `exec` function behave differently in Python 2 and Python 3?

Python 2 と Python 3 の exec 関数の動作

exec 関数は、Python 2 と Python 3 の間で異なる動作を示します。Python 2 では、exec はステートメントです。一方、Python 3 では、関数に移行しました。この違いは、ローカル変数との相互作用に重大な影響を及ぼします。

Python 2 の動作

Python 2 では、exec ステートメントにより関数のスコープ内でローカル変数を変更できます。 exec ステートメントが実行されると、Python コンパイラーはローカル スコープの最適化を一時的に無効にし、ローカル変数とグローバル変数の両方にアクセスするために低速のルックアップ戦略に切り替えます。さらに、明示的なグローバルパラメータとローカルパラメータが指定されていない場合、exec ステートメント内で宣言された変数はすべて関数のローカルパラメータに自動的にコピーされます。

Python 3 の動作

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。