首先我们有这个:
def some(a):
if a is None or "*":
print "*"
else:
print a
>>> some("*")
*
>>> some("d")
*
它失败了,但我无法给自己足够好的理由说明它失败了。
显然这是因为我写错了,工作版本会是:
def some(a):
if a in [None, "*"]: # or write [ if a is None or a is "*" ]
print "*"
else:
print a
>>> some("*")
*
>>> some("d")
d
尽管只写出正确的版本几乎是直观的,但我无法向自己解释为什么第一个版本失败。
所以问题是,为什么第一个版本失败了?
答案 0 :(得分:3)
声明:
if a is None or "*":
语义上意味着
if ((a is None) is True) or (the value "*" is True)
作为非空字符串的值"*"
始终为True
。因此,整个表达式将评估为True
。
答案 1 :(得分:1)
这将始终评估为True
if a is None or "*":
如果你想要
,你可以这么说 if a is None or a== "*":
答案 2 :(得分:1)
以下陈述不符合您的期望:
if a is None or "*":
这相当于:
if (a is None) or "*":
所以它总是True
。要获得所需的行为,请使用:
if a is None or a == "*":