2013-02-09 79 views
29

假設我有一個循環:如何在Python中更改for循環的索引?

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

我想改變i是否符合一定的條件。我試過但沒有工作。 我該如何解決?

+2

使用'while'循環,而不是'is'使用'=='。 – 2013-02-09 06:11:24

+1

爲什麼你想改變迭代的索引?這絕對是一種氣味。 – 2013-02-09 06:15:36

+0

我正在寫東西像一個彙編代碼解釋器。所以,由於我的實施,我必須跳到某些指示。 – drum 2013-02-09 06:20:43

回答

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 2013-02-09 06:14:52

+17

@drum:想要從循環內部手動更改循環索引感覺混亂。 – BrenBarn 2013-02-09 06:15:16

+2

至少用'while',我們不會把它誤認爲是一個「常規」循環,它會在迭代範圍內迭代。 – 2013-02-09 06:16:54

1

這個概念在C世界並不罕見,但應儘可能避免。然而,這是我實施它的方式,我覺得很清楚發生了什麼事情。然後,你可以把你的邏輯在索引中環內的任何地方跳躍前進,讀者會知道要注意跳過變量,而嵌入的I = 7深的地方可以很容易被忽略:

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

    if i=5: 
     skip = 2 

    <other stuff> 
+1

雖然跳過是一種選擇,但它絕對不是這個問題的恰當答案。根據這個問題,人們也應該能夠循環往復。接受的答案用一個while循環解決了這個問題。 – drum 2016-09-07 21:08:31

3

關於爲什麼問題中的循環無法按預期工作的更多背景知識。

環路

for i in iterable: 
    # some code with i 

基本上

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

的速記所以for循環從從由一個可迭代一個構成一個迭代中提取值,並自動時的迭代器是識別用盡並停止。

正如你所看到的,在while循環我被重新分配的每次迭代,因此的i值將,無論您在# some code with i部分發出任何其他再分配的覆蓋。

由於這個原因,Python中的for循環不適合循環變量的永久更改,您應該使用while循環代替,如在Volatility的答案中已經演示的那樣。