2012-11-03 91 views
0

我不明白爲什麼下面的陳述不工作。奇怪的聲明行爲?

randomKey = random.choice(list(topic.keys())) 
randomValue = random.choice(topic[randomKey]) 

current = "-" * len(randomValue) 
while current != randomValue: 
    (statements) 
else: 
    (statements) 

但是,如果我改變後的1號線到

while current == randomValue: 

聲明「別人的正確執行。否則,'else'之後的語句不會執行。任何想法爲什麼可能會導致奇怪的行爲?完整代碼已被排除,因爲它將貫穿整個頁面。

+0

有沒有辦法,我們能做的不僅僅是野生猜測更好,如果你不熬下來,以一個簡單的工作示例。要麼是條件從未如此,要麼你在那裏有一個'break'... – mgilson

+0

謝謝,但是我查看了整個代碼並沒有發現關鍵字:( – brainsfrying

+0

請善意查看我的編輯。 'random'會導致這種奇怪的行爲嗎? – brainsfrying

回答

1

它是Python語法的一部分。從the documentation

這並[a while語句]反覆測試的表達,並且如果它是真實的,則執行所述第一套件;如果表達式爲假(可能是第一次測試),else子句的套件(如果存在)將被執行,並且循環終止。

因此,在第一種情況下,它必須是while條件永遠不會計算爲false,而在第二種情況下它最終會做到。請注意,明確地跳出循環將而不是執行else子句。

+0

謝謝,但是我查看了整個代碼,並且沒有中斷關鍵字:( – brainsfrying

+0

請善意查看我的編輯。想知道'random'是否會導致這種奇怪的行爲? – brainsfrying

+0

@brainsfrying:The答案仍然是一樣的,你的隨機選擇可能導致條件在一種情況下評估錯誤,而不是在另一種情況下評估錯誤,而不是使用隨機的,你能提供一個總是失敗/成功的固定值的確定性例子嗎? – BrenBarn

0

else,與while使用時可運行而表達式的計算結果爲falsy值之後,如果由表達式while循環結束爲假,而不是由一個break語句被細分的(或執行經由離開功能returnraise-例外)。第二個示例中的while條件必須失敗,因此發生break的機會不存在,返回的函數或拋出的異常,因此else語句將始終運行。

docs for while

+0

謝謝你,但我看了整個代碼,並沒有任何中斷關鍵字:( – brainsfrying

+0

請親切看我的編輯。如果「隨機」導致這種奇怪的行爲? – brainsfrying