在python中,如果您编写类似
foo==bar and spam or eggs
如果布尔语句为true,则python似乎返回垃圾邮件,否则返回egg。有人可以解释这种行为吗?为什么表达式不像一个长布尔值那样被求值?
编辑:具体来说,我试图弄清楚为什么该表达式的结果返回“ spam”或“ eggs”的机制。
运算符and和or短路,这意味着如果仅从对第一个操作数求值就可以得出表达式的结果,则不对第二个操作数求值。例如,如果您具有表达式a or b并且a计算结果为true,那么不管什么都没关系b,表达式的结果为true,因此b不进行计算。实际上,它们的工作方式如下:
and
or
a or b
a
b
a and b
Falsey和Truey表示在布尔上下文中评估为false或true的值。
但是,在没有更好的选择的时候,这个和/或惯用语是有用的,但是现在有了更好的方法:
spam if foo==bar else eggs
和/或惯用语的问题(除了使初学者感到困惑之外)是,如果条件为真,但垃圾邮件的计算结果为假值(例如,空字符串),则会给出错误的结果。因此,您应该避免这种情况。