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'])
このアプローチでは、定義された名前空間内の変数の変更を許可しながら、関数のローカル スコープがそのまま維持されることが保証されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3