リスト内包表記の予期しない動作: 名前のリバウンドとスコープのぼやけ
Python のリスト内包表記は、リストを作成するための簡潔で便利な方法を提供します。しかし、これには隠れた落とし穴があります。それは、範囲を超えても名前を再バインドしてしまうことです。理解そのもの。 Python 2 では、この独特の動作がフラストレーションやプログラミング エラーの原因となっています。
次のコードを考えてみましょう:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
Python 2 では、このコードを実行すると、予期せず 4 が出力されます。 「本来の価値」。これは、リスト内包表記がループ制御変数 x を周囲のスコープにリークし、元の値をオーバーライドするためです。
この動作は、効率を向上させるための最適化として Python 2 でリスト内包表記が実装された方法に由来します。しかし、これは Python プログラマーにとって大きな悩みの種であり、エラーや混乱を引き起こします。
ありがたいことに、Python 3 では、この「ちょっとした汚い秘密」が排除されました。リスト内包表記は、別の実行フレームを使用するジェネレーター式と同じ実装戦略を採用するようになりました。その結果、Python 3 では、内包表記内の x が周囲のスコープ内の x を覆い隠さないため、上記のコード スニペットは期待どおりに「元の値」を正しく出力します。
Python の作成者、Guido van Rossum、この変更の背後にある理由を説明しました:
「[この変更は] を使用してリスト内包表記の「ちょっとした秘密」を修正するために行いました。ジェネレーター式と同じ実装戦略です。"
Python 3 でのこの改善された動作は、リスト内包表記の使用法がより明確で予測可能であることを保証する、Python 言語の継続的な開発と改良の証拠です。
以上がPython 2 のリスト内包表記がスコープ外の名前を再バインドするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。