潜入python和 - 或失败

时间:2012-05-24 16:52:01

标签: python

我被困在这个特殊的例子中,从潜水到python

示例4.18。当and-or Trick失败

>>>>a = ""
>>>>b = "second"
>>>1 and a or b
>>>>'second'

由于a是一个空字符串,Python在布尔上下文中认为是假的,1和''评估为'',并且 然后''或'秒'评估为'秒'。哎呀!这不是你想要的。 and-or trick,bool和a或b,不会像C表达式bool一样工作? a:b当a中的a为假时 布尔上下文。

为什么它说它不是用户想要的,我的意思是1和“”将评估为False,而“”或b将评估为“秒”,这完全是应该发生的事情,我不明白为什么这是错的?我错过了什么吗?

4 个答案:

答案 0 :(得分:4)

不,你不会错过任何东西。

PEP 308中将expr if cond else expr内联条件引入Python 2.5;在此之前,条件必须是完整的形式

if cond:
    expr
else:
    expr

然而,人们注意到expr and cond or expr排序作为内联条件,只要第一个表达式恰好评估为布尔值true。由于Python中的大多数内容都是正确的,因此这种语法通常会起作用 - 当然,有时会失败。事实上,这是添加“适当的”内联条件的动机。

答案 1 :(得分:2)

“and-or trick”用于模拟三元条件运算符condition ? if-true : if-false或类似函数。由于1在布尔上下文中等同于True,因此表达式应该生成a,而不是b。所以,教训是,不要使用和 - 或欺骗。从2.5开始,Python有三元条件:

true if condition else false

答案 2 :(得分:2)

深入了解python并不是一个好的教程和should not be followed


在python具有正确的三元表达式(x and y or z)之前使用了y if x else z表达式。本节说明如果您希望它的行为类似于C x ? y : z,它会让您感到惊讶。


python wiki.上有一个教程列表可能会为您提供更新的资源。

答案 3 :(得分:0)

  

为什么它说它不是用户想要的,我的意思是1和“”会   评估为False,而“”或b将评估为“秒”,即   完美应该发生什么,我不明白为什么是错的?我   遗失了什么?

我觉得这部分问题被忽略了。 condition and if-true or if-false是版本> 2.5中使用的技巧,如其他答案所述,模仿其他语言的condition ? if-true : if-false或更高版本'if-true if condition else if-false

问题是如果if-true是一个评估为false的对象(""[]()False或{{1然后,这会失败,正如您在查看评估时所预期的那样,但如果动态设置0并且可以评估为false,则可能会出现错误。

if-true的天真预期结果将是condition and a or ba,空字符串)的内容,因为条件("")的计算结果为{{1 }},但由于1评估为true,因此您获得了1 and a的内容。

此问题的解决方案是使用Python 2.5+语法(false)或确保b永远不会为假。完成第二种方法的一种方法是将if-true if condition else if-falseif-true打包在元组或列表中,因为非空迭代始终为真:

if-true

这是一种丑陋的解决方案,但如果您需要针对旧版本的Python,它就会存在。