5 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個贊
因?yàn)閛r運(yùn)算符通過檢查第一個條件來工作,如果第一個條件不為真,則檢查第二個條件。
你的左邊or是真的(len(message) == 0),所以右邊不被執(zhí)行(message[0] == message[-1])。因此,您不會得到范圍異常。
如果交換順序,message[0] == message[-1]位于運(yùn)算符的左側(cè),因此執(zhí)行時不會檢查字符串是否為空。
您將在此示例中看到
def condition_1():
print('condition_1 executed')
return True
def condition_2():
print('condition_2 executed')
return True
if condition_1()or condition_2():
print('one condition is true')
你會得到condition_1 executed。如果更改condition_1 為 return false,您將同時得到condition_1 executed和condition_2 executed。

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個贊
第一個程序工作的原因是它首先檢查len
消息的 0 是否為 0,如果是,True
則立即進(jìn)入 if 語句,而第二個程序首先檢查第一個字母是否等于最后一個字母,并且由于空字符串如果失敗則沒有索引 0。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個贊
最近,當(dāng)我瀏覽cs61a時,我在課程網(wǎng)站上發(fā)現(xiàn)了一些非常有用的信息,我決定涵蓋重要部分并將鏈接放在這里,供其他可能提出這個問題的人作為參考。
這個問題基本上是由Python處理表達(dá)式的順序引起的,即Short Circuiting。例如,當(dāng)您在 Python 中鍵入以下內(nèi)容時:
1?/?0?or?True
我們會得到 a?ZeroDivisionError
,因?yàn)?1 除以 0 在數(shù)學(xué)中是無效的。聽起來很合理,對吧?但是運(yùn)行這段代碼我們會得到什么呢?
True?or?1?/?0
True
既然它只是交換了和 的順序1 / 0
,也許我們會得到相同的結(jié)果?答案是否定的,運(yùn)行代碼后,我們得到了True
相反的結(jié)果,這就是短路的工作原理!
當(dāng)運(yùn)算符到達(dá)允許他們對表達(dá)式做出結(jié)論的操作數(shù)時,就會發(fā)生短路。在這種情況下,or
一旦到達(dá)第一個真值就會短路,因?yàn)樗乐辽儆幸粋€值是真而不執(zhí)行1 / 0
(盡管它是無效的)。同樣,and
當(dāng)?shù)谝粋€值為 false 時會短路,因?yàn)樗啦⒎撬兄刀际?true。
這是備忘單:
操作員 | 支票 | 從左到右評估 |
---|---|---|
和 | 如果所有值都是 true | 第一個假值 |
或者 | 如果至少有一個值為 true | 第一個真實(shí)值 |

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個贊
這是因?yàn)榈诙€程序中出現(xiàn)“IndexError:字符串索引超出范圍”錯誤。第一個程序首先比較 len(message) 并且已經(jīng)有一個“True”。雖然您的第二個程序首先將第一個字符與最后一個字符進(jìn)行比較。所以這個問題。

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個贊
如果至少一個條件為真,“或”語句為 True。當(dāng)“or”的左側(cè)為 true 時,右側(cè)不會執(zhí)行,因此第二個程序中出現(xiàn)空字符串錯誤,但第一個程序中的空字符串沒有錯誤
添加回答
舉報