在Python中应该用什么替代与False的比较?

2 投票
5 回答
2176 浏览
提问于 2025-04-17 18:01

我有一个函数,如果找不到东西就返回 False,如果找到了,就返回一个包含我想要的内容的数据结构。在一个 for 循环中,我把这个函数返回的值赋给一个变量 my_var,然后用 if my_var == False: continue 来继续下一个循环。

但是 pychecker 不喜欢这样写,它提示说 与 False 的比较没有必要,可能不会按预期工作

那么,Python 中正确的做法是什么呢?

5 个回答

2

如果你只是想检查一个值是否是“假”的话:

myval = findit('something')
if not myval:
   "not found"

但如果你可能会返回一个“假”的值,比如说找到了一个空列表[],这时候你就不应该这样做,因为它会错误地报告“没有找到”。

如果你在意这个值确实是False,那么就用is来比较。TrueFalseNone都是独一无二的,所以用身份比较运算符来比较它们。

if myval is False:
   "not found"

在这种情况下,你把False当作一个特殊值,用来表示没有结果。

通常情况下,None被用作表示“没有值”的特殊值,所以我建议你修改你的函数,让它在没有找到值的时候返回None。这样做更符合Python的习惯,也和一些方法的行为一致,比如{}.get('missing-key')

myval = findit('something')
if myval is None:
    "not found"

在一些情况下,如果任何值都有可能被返回(甚至是NoneFalse),就不能使用特殊值,这时Python会用异常来表示没有找到值。例如,{}['missing-key']会引发KeyError异常。

3

通常情况下,如果一个对象不匹配,你应该返回 None 而不是 False。然后你可以检查 if my_var == None:,因为所有的 not 0not Falsenot None 都会返回 True

3

作为表示没有结果的返回值,None 几乎总是更好的选择。

  • 如果你必须使用 False,那么用 not my_var 来判断。这是因为我们假设非 False 的返回值永远不会是“假”的(bool() 会把它转换成 False,这适用于空字符串、空集合和其他一些情况)。

  • 如果对象可能是“假”的,但又必须和 False 区分开来,那么就需要进行比较,这时你得忽略错误(稍微变动一下,my_var is False 会更符合习惯,但实际上差不多)。不过,这种情况并不好,应该为了清晰起见而避免。

再说一遍:如果可能的话,使用 None 并测试 my_var is None

撰写回答