ホームページ  >  記事  >  バックエンド開発  >  Python 2 と 3 のリスト内包表記では、名前の再バインドはどのように異なりますか?

Python 2 と 3 のリスト内包表記では、名前の再バインドはどのように異なりますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 15:07:11354ブラウズ

How Does Name Rebinding Differ in Python 2 and 3 List Comprehensions?

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

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