2017-10-20 16 views
1

ここには簡単な質問があります。私の仕事は、リストをループし、それが持つ各要素を印刷することです。各印刷の後、私は同様にリストからこの要素を削除するつもりです。私のコードは次のとおりです。Python:リストをループしながらリスト内の要素を削除する

>> a = [1,2] 
>> for x in a: 
>> print x 
>> a.remove(x) 
>> print a 

出力は次のとおりです。

>> 1 
>> [2] 

しかし、奇妙な何かがここに起こる:のみ1が印刷されたリストから1を削除した後にそれはそう 、プログラムはの飛び出し直接ループします。私の前提はリストの内容を変更した後ですが、イテレータも影響を受けるかもしれませんが、私はあまりよく分かりません。より安全な方法は次のとおりです。

>> a = [1,2] 
>> b = list(a) 
>> for x in b: 
>> print x 
>> a.remove(x) 
>> print a 

もっと詳しい説明はありますか?

+1

イテレータは位置を追跡します(yes)。しかし、なぜあなたはそれぞれの要素を取り除くことに気をつけますか?あなたは空のリストで終わるでしょう。 – jonatan

+3

'b = list(a)'はリストのコピーを作成するので、 'a'と' b'は異なるオブジェクトになります。 [this](https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/)が便利かもしれません。 – roganjosh

+0

[この回答](https://stackoverflow.com/a/34238688/8747)はちゃんと説明しています。 –

答えて

0

forで反復処理するリストから要素を削除しないでください。

あなたの推測は近いです - あなたがより明確にあなたが長いリストを使用する場合何が起こっているかを見ることができます。

a = [1,2,3,4,5] 
for x in a: 
    print x 
    a.remove(x) 
    print a 

出力:

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

それはインデックス0の要素を印刷し、その後、インデックスを1、次にインデックス2 ...そしてインデックス3はありません。

この例では、インデックス1の要素を出力し、インデックス2は存在しません。

2
a = [1,2] 
while a: 
    print a.pop(0) 
    print a 
関連する問題