11

私はPythonが初めてで、Linux2でPython 3.2.3(デフォルト、2012年10月19日、20:13:42)、[GCC 4.6.3]を使用しているリストを試しています

これが私のサンプルコードです

>>> l=[1,2,3,4,5,6]
>>> for i in l:
...     l.pop(0)
...     print(l)
... 

次の出力が期待されます

1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]
4
[5, 6]
5
[6]
6
[]

代わりに私はこれを取得しています

1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]

for ループは 3 ターン後に反復を停止します。誰かが理由を説明できますか?

4

6 に答える 6

13

少し展開します (キャレット ( ^) はループの「インデックス」にあります):

your_list = [1,2,3,4,5,6]
             ^

最初のアイテムをポップオフした後:

your_list = [2,3,4,5,6]
             ^

ループを続行します。

your_list = [2,3,4,5,6]
               ^

最初のアイテムを取り出します。

your_list = [3,4,5,6]
               ^

ループを続行します。

your_list = [3,4,5,6]
                 ^

最初のアイテムをポップします:

your_list = [4,5,6]
                 ^

ループを続けます。待ってください。これで完了です。:-)


>>> l = [1,2,3,4,5,6]
>>> for x in l:
...     l.pop(0)
... 
1
2
3
>>> print l
[4, 5, 6]
于 2012-12-18T18:44:26.347 に答える
3

反復しているコレクションを変更しようとするときは注意が必要です。この場合、リストは単純な整数インデックスで「現在の位置」を追跡します。を使用するpop()と、すべてがインデックスを変更するため、要素はスキップされます。

ループの最初の反復では、i は l[0] です。次に、リストをポップし、l[1] にアクセスします。これは、もともと l[2] にあったものです。次に、リストをポップすると、次の反復で l[2] にアクセスします。これは、以前は l[4] にあったものです。

とにかく、このコードで要素をポップする必要はありません。おそらく、実際のコードでもっと複雑なことをしているでしょう。

于 2012-12-18T18:40:37.603 に答える
2

Python は、反復処理中にリストの長さを変更することをサポートしていません。コピーで作業するか、代わりにリスト内包表記を使用してください。

Python が実際に for ループをどのように実行しているかを考えてみてください。要素をカウントアップし、現在のインデックスの項目を返します。1 つを削除すると、インデックスは別の要素を意味します。

于 2012-12-18T18:40:20.703 に答える