在Python中应该用什么替代与False的比较?
我有一个函数,如果找不到东西就返回 False
,如果找到了,就返回一个包含我想要的内容的数据结构。在一个 for
循环中,我把这个函数返回的值赋给一个变量 my_var
,然后用 if my_var == False: continue
来继续下一个循环。
但是 pychecker
不喜欢这样写,它提示说 与 False 的比较没有必要,可能不会按预期工作
。
那么,Python 中正确的做法是什么呢?
5 个回答
如果你只是想检查一个值是否是“假”的话:
myval = findit('something')
if not myval:
"not found"
但如果你可能会返回一个“假”的值,比如说找到了一个空列表[]
,这时候你就不应该这样做,因为它会错误地报告“没有找到”。
如果你在意这个值确实是False
,那么就用is
来比较。True
、False
和None
都是独一无二的,所以用身份比较运算符来比较它们。
if myval is False:
"not found"
在这种情况下,你把False
当作一个特殊值,用来表示没有结果。
通常情况下,None
被用作表示“没有值”的特殊值,所以我建议你修改你的函数,让它在没有找到值的时候返回None
。这样做更符合Python的习惯,也和一些方法的行为一致,比如{}.get('missing-key')
。
myval = findit('something')
if myval is None:
"not found"
在一些情况下,如果任何值都有可能被返回(甚至是None
或False
),就不能使用特殊值,这时Python会用异常来表示没有找到值。例如,{}['missing-key']
会引发KeyError
异常。
通常情况下,如果一个对象不匹配,你应该返回 None
而不是 False
。然后你可以检查 if my_var == None:
,因为所有的 not 0
、not False
和 not None
都会返回 True
。
作为表示没有结果的返回值,None
几乎总是更好的选择。
如果你必须使用
False
,那么用not my_var
来判断。这是因为我们假设非False
的返回值永远不会是“假”的(bool()
会把它转换成False
,这适用于空字符串、空集合和其他一些情况)。如果对象可能是“假”的,但又必须和
False
区分开来,那么就需要进行比较,这时你得忽略错误(稍微变动一下,my_var is False
会更符合习惯,但实际上差不多)。不过,这种情况并不好,应该为了清晰起见而避免。
再说一遍:如果可能的话,使用 None
并测试 my_var is None
。