以下代码并不报错,而我理解在"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)
直接被无视掉, 相当于空气;and
前的x == 10
为False
, 所以短路其后所有and
表达式,直到有or
出现,输出and
左侧表达式到or
的左侧,参与接下来的逻辑运算, 然而并没有发现, 所以位于and
右侧的表达式(y - 1 == 199)
直接被无视掉, 相当于空气;如果把
如果把x == 10
改为x == 100
, 这时and
左侧为True
, 右侧的表达式不能短路, 要参与逻辑运算, 此时由于局部变量y
x == 10
改为x == 100
, 这时and
左侧为True
, 右侧的表达式不能短路, 要参与逻辑运算, 此时由于局部变量y
并没有被创建, 所以会报错, 报错内容应该是类似这种🎜1!!!!!!!!!!!!!!!!!!