以下代碼并不報錯,而我理解在”point 1″處如果先運算小括號里面的表達式,而y并不存在,不應該報錯嗎?難道發現x == 10的短路運算優先于小括號里面的表達式運算?
將這一行中x == 10改為x == 100后報錯了,這個理解沒問題。
# coding: utf-8
if __name__ == "__main__":
x = 100
if x == 10:
y = 200
# no y exist here
if x == 10 and (y - 1 == 199): ? ?# point 1
print "ok"
從左到右計算
括號不改變這一事實
這個很正常啊, 建議看下這個帖子:
python中 and 和 or 運算的核心思想 ——— 短路邏輯
就你的例子來說,
and
前的
x == 10
為
False
, 所以短路其后所有
and
表達式,直到有
or
出現,輸出
and
左側表達式到
or
的左側,參與接下來的邏輯運算, 然而并沒有發現, 所以位于
and
右側的表達式
(y - 1 == 199)
直接被無視掉, 相當于空氣;
如果把
x == 10
改為
x == 100
, 這時
and
左側為
True
, 右側的表達式不能短路, 要參與邏輯運算, 此時由于局部變量
y
并沒有被創建, 所以會報錯, 報錯內容應該是類似這種
NameError: name 'y' is not defined
1!!!!!!!!!!!!!!!!!