Python リスト内包表記での名前の再バインド
リスト内包表記は、Python でリストを生成するエレガントな方法を提供します。ただし、予期しない動作を引き起こす可能性がある独特のスコープ設定セマンティクスを示します。
次のコード スニペットを考えてみましょう:
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 3 では、上記のコードは「元の値」を出力します。
この変更の背後にある理論的根拠は、Python の作成者である Guido van Rossum によって次のように説明されています。
"In Python 2 では、リスト内包表記によってループ制御変数が周囲のスコープに漏れていました。これは意図的ではなく、混乱とエラーを引き起こしていました。Python 3 では、この動作はジェネレーターに合わせて変更されました。
この変更により Python コードの堅牢性が向上しますが、Python 2 と 3 の動作の違いに注意することが重要です。適切なカプセル化手法 (例: ループ制御変数の前に付けるなど)アンダースコアを使用した内包表記は、この潜在的な落とし穴を軽減するのに役立ちます。
以上がPython 2 と 3 のリスト内包表記では、名前の再バインドはどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。