2013-02-09 8 views
29

は、私がforループを持っていると仮定します。Pythonでforループのインデックスを変更するには?

for i in range(1,10): 
    if i is 5: 
     i = 7 

が、私はそれが一定の条件を満たしている場合iを変更したいです。私はこれを試みたが、うまくいかなかった。 どうすればいいですか?

+2

'while'ループを使用し、' is'の代わりに '=='を使用します。 –

+1

なぜあなたは反復のインデックスを変更したいですか?これは間違いなく匂いです。 –

+0

私はアセンブリコードインタプリタのようなものを書いています。だから私は実装のために特定の指示にジャンプする必要があります。 – drum

答えて

48

あなたの特定の例の場合、これは動作します:

for i in range(1, 10): 
    if i in (5, 6): 
     continue 

しかし、あなたはおそらくwhileループを備えたほうが良いでしょう:

i = 1 
while i < 10: 
    if i == 5: 
     i = 7 
    # other code 
    i += 1 

forループは、変数を割り当てます(この場合はi)を各反復の開始時にリスト/反復可能な要素の次の要素に追加します。つまり、ループ内で何をしても、iは次の要素になります。 whileループにはこのような制限はありません。

+1

これは唯一の方法ですか?厄介なことを感じる。 – drum

+17

@drum:ループ内からループインデックスを手動で変更したいのは面倒です。 – BrenBarn

+2

whileでは、少なくとも、反復処理を約束している範囲で反復する "通常の"ループを間違えません。 –

1

この概念はC世界では珍しいことではありませんが、可能であれば避けるべきです。 それにもかかわらず、これは私がそれを実装した方法で、何が起こっているのかがはっきりしていると感じました。そして、あなたは、ループ内の任意の場所をインデックスに前方にスキップするあなたのロジックを置くことができ、そして読者が私を埋め込むのに対し、スキップ変数に注意を払うように知っている= 7は、どこか深い見逃しやすいことができます。

skip = 0 
for i in range(1,10): 
    if skip: 
     skip -= 1 
     continue 

    if i=5: 
     skip = 2 

    <other stuff> 
+1

スキップはオプションですが、間違いなくこの質問に対する適切な答えはありません。この質問によれば、ループの中を行き来することもできるはずです。受け入れられた答えはwhileループでこれに取り組んだ。 – drum

3

質問のループが期待どおりに機能しない理由を少し詳しく説明します。

ループ

for i in iterable: 
    # some code with i 

だからforループは一つによって反復可能なものから構成されたイテレータから値を抽出し、自動的に反復子がある場合に認識

iterator = iter(iterable) 
while True: 
    try: 
     i = next(iterator)    
    except StopIteration: 
     break 
    # some code with i 

ため基本的速記であります消耗して停止する。

あなたが見ることができるように、whileループの各反復で、私は、したがって、iの値に関係なく、あなたが# some code with i一部に発行し、他の再割り当ての上書きされます、再割り当てされます。

このため、Pythonのforループはループ変数の永続的な変更には適していないため、ボラティリティの答えで既に説明したように、whileループに頼るべきです。

関連する問題