ホームページ >バックエンド開発 >Python チュートリアル >反復中にリストを変更すると予期しない結果が生じるのはなぜですか?

反復中にリストを変更すると予期しない結果が生じるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-05 15:52:40477ブラウズ

Why Does Modifying a List During Iteration Lead to Unexpected Results?

反復中のリストの変更

提供されたコード スニペットは、ループ処理中にリストを変更すると予期しない動作を示します。

l  = range(100)                         
for i in l:                         
    print i,                         
    print l.pop(0),                  
    print l.pop(0)

このコードの出力は、リストを変更する行為 (要素のポップによる) のため、予想されるものとは異なります。イテレータに影響を与えます。リストに対してイテレータが作成されると、リスト内の現在の位置が追跡されます。要素がリストから削除されると、それに応じてイテレータの位置が調整されます。ただし、反復の進行中にリストが変更されると、反復子の位置が無効になり、予測できない結果が発生する可能性があります。

この特定のケースでは、ループはリスト l 内の要素をループすることを目的としています。 。ただし、要素がリストからポップされると、反復子の位置が移動し、リスト内の次の要素をスキップします。その結果、ループは元のリストの要素の半分のみを反復処理します。

この動作を回避するには、反復処理されているコンテナーを決して変更しないことが重要です。代わりに、コンテナのコピーを作成し、それを反復処理する必要があります。これは、ループを開始する前にリストをコピーすることで実現できます:

l_copy = l[:]
for i in l_copy:
    print i,                         
    print l.pop(0),                  
    print l.pop(0)

あるいは、for ループの代わりに while ループを使用して、リスト内の現在位置の別のインデックスを維持することもできます:

i = 0
while i < len(l):
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
    i += 1

以上が反復中にリストを変更すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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