2016-07-11 2 views
1

反復処理が実行されている間changableです:可変範囲を構築できますか?変更可能なオブジェクトの上に

a = [11, 12, 13] 

for i in a: 
    if i == 12: 
     a.append(20) 
    print(i) 

結果を

11 
12 
13 
20 

そしてa[11, 12, 13, 20]

あるしかし、私はrangeを使用する場合には変更できません

a = [11, 12, 13] 

for i in range(len(a)): 
    if i == 1: 
     a.append(20) 
    print(a[i]) 
しばらく

11 
12 
13 

との

結果はまだその後[11, 12, 13, 20]です。

myrangeオブジェクトを作成する方法はありますか?範囲と同じように動作しますが、実行中に変更可能ですか? 2番目のコードスニペットで

+0

このコードには発電機がありません。いずれかのコードスニペットが何をしているのか理解していますか? – user2357112

+1

警告:最初のコードは、比較と追加が同じ値であると頭痛を引き起こす可能性があります。あなたは警告を受け取ることはありませんが、反復しているリストを変更することは望ましくありません。 –

+0

@ user2357112、私は何も確認しないようにしています:-)。しかし、この場合、私はちょうど "ジェネレータ"という言葉を誤解していると思います。私はこの問題を修正して取り除きました。 – Aguy

答えて

2

はい、できます、そしてあなたはaがすでに可変なので、代わりにループの前にlen(a)に基づいています範囲を反復処理を、あなたは次の操作を行うことができ、自分自身を言ったように:

for i, val in enumerate(a): 
    if i == 1: 
     a.append(20) 
    print(val) 

出力:

11 
12 
13 
20 
0

for i in range(len(a)): 
    if i == 1: 
     a.append(20) 
    print(a[i]) 

あなたがrange(len(a))を使用するときに今、forループa==3の長さとしてのみ3回繰り返されることになると、それはこの場合には[2、0、1]を返します。 len(a)は、すでに3つの要素のリストを返したループの開始時に実行され、リストを更新すると、len(a)は決して再度実行されないので、変更は反映されません。

aをforループの外側に印刷すると、リストの最後に追加された要素(20)が表示されます。

2番目のケースでは、リスト全体を反復しようとしていますが、リスト全体が使い果たされるまで、結果はyieldのままです。

関連する問題