为什么它说这不是用户想要的,我的意思是 1 和 "" 将评估为 False,而 "" 或 b 将评估为 "second",这完全是应该发生的,我不明白为什么会这样错了吗?我错过了什么吗?
我觉得这部分问题被忽略了。condition and if-true or if-false
如其他答案中所述,是在 >2.5 版本中使用的技巧,以模仿其他语言condition ? if-true : if-false
或更高版本if-true if condition else if-false
。
它的问题是,如果if-true
是一个评估为假的对象(、、、""
或)[]
,那么这将失败()
,正如您查看评估时所预期的那样,但如果动态设置并且可以评估,则可能会作为错误潜入为假。False
0
if-true
的天真预期结果condition and a or b
将是a
( ""
, 空字符串) 的内容,因为条件 ( 1
) 计算结果为true
,但1 and a
计算结果为 ,false
因此您得到 的内容b
。
此问题的解决方案是使用 Python 2.5+ 语法 ( if-true if condition else if-false
) 或确保它if-true
永远不会为假。完成第二种方法的一种方法是将if-true
和打包if-false
在一个元组或列表中,因为非空可迭代始终为真:
>>> a = ""
>>> b = "second"
>>> condition = 1
>>> condition and a or b
'second'
>>> condition and [a] or [b]
['']
>>> (condition and [a] or [b])[0]
''
这是一种丑陋的解决方案,但如果您需要针对旧版本的 Python,它就在那里。