我被困在这个特殊的例子中,从潜水到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将评估为“秒”,这完全是应该发生的事情,我不明白为什么这是错的?我错过了什么吗?
答案 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 b
(a
,空字符串)的内容,因为条件(""
)的计算结果为{{1 }},但由于1
评估为true
,因此您获得了1 and a
的内容。
此问题的解决方案是使用Python 2.5+语法(false
)或确保b
永远不会为假。完成第二种方法的一种方法是将if-true if condition else if-false
和if-true
打包在元组或列表中,因为非空迭代始终为真:
if-true
这是一种丑陋的解决方案,但如果您需要针对旧版本的Python,它就会存在。