ホームページ >バックエンド開発 >Python チュートリアル >Python 2 のリスト理解スコープが Python 3 と異なるのはなぜですか?

Python 2 のリスト理解スコープが Python 3 と異なるのはなぜですか?

DDD
DDDオリジナル
2024-11-30 11:50:11736ブラウズ

Why Does Python 2's List Comprehension Scope Differ from Python 3?

リスト内包表記: スコープの混乱の原因

Python 2 のリスト内包表記の独特な側面の 1 つは、変数のスコープとの異常な相互作用です。具体的には、リスト内包表記のループ制御変数が周囲のスコープに「漏れ」、潜在的なエラーや混乱を引き起こします。

次のコードを考えてみましょう。

x = "original value"
squares = [x**2 for x in range(5)]
print(x)  # Prints 4 in Python 2!

Python 2 では、これはコードは予期せず「元の値」の代わりに 4 を出力します。これは、リスト内包表記で使用されるループ制御変数 x が、内包表記の外で定義された x を一時的に隠すためです。このシャドウイングは、理解が完了した後も継続します。

この動作は、微妙でデバッグが難しいエラーを引き起こす可能性があるため、フラストレーションの重大な原因となる可能性があります。さらに、リスト内包表記に通常伴う利便性と単純性が損なわれます。

ただし、Python 3 では、この動作は解決されました。リスト内包表記では、ループ制御変数が周囲のスコープに漏れなくなりました。これにより、常にこのように動作してきたジェネレータ式と一致します。

Python の作成者である Guido van Rossum 氏によると、リスト内包表記の元の漏れの多い実装は、最適化するために行われた「意図的な妥協」でした。彼らのパフォーマンス。しかし、Python 3 では、パフォーマンスの向上により、この妥協は不要であると考えられました。

Python 3 でのこのリーク動作の排除により、リスト内包の信頼性と一貫性が大幅に向上しました。意図しない変数シャドウイングの可能性を排除することで、プログラマはより安心して変数を使用できるようになりました。

以上がPython 2 のリスト理解スコープが Python 3 と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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