将'=='替换为'is'比较布尔值是否安全

103 投票
7 回答
94199 浏览
提问于 2025-04-16 09:22

我做了一些布尔比较:

>>> (True or False) is True
True
>>> (True or False) == True
True

听起来 ==is 在布尔值上是可以互换使用的。

有时候用 is 更清楚一些。

我想知道:

TrueFalse 在 Python 中是预先分配好吗?

bool(var) 的返回值总是和预先分配的 True(或 False)相同吗?

is 来比较布尔值是否安全?


这不是关于最佳实践的问题。

我只是想知道真相。

7 个回答

7

没错。在Python中,布尔值只有两个,分别是True和False:

布尔类(bool)不能被进一步继承。它的唯一实例就是False和True。

这意味着如果你知道两个操作数都是布尔值,那么==is的效果是一样的。不过,正如detly所提到的,通常在这种情况下没有必要使用这两者中的任何一个。

60

注意你可能在比较的其他内容。

>>> 1 == True
True
>>> 1 is True
False

在你的 Python 程序中,True 和 False 的对象 ID 在它们的生命周期内是稳定的。

>>> id(True)
4296106928
>>> id(True)
4296106928

is 用来比较一个对象的 ID。

补充说明:添加 or

因为提问者在问题中使用了 or,所以值得指出这一点。

or 结果为 True 时: 返回第一个 'True' 的对象。

>>> 1 or True
1
>>> 'a' or True
'a'
>>> True or 1
True

or 结果为 False 时: 返回最后一个 'False' 的对象。

>>> False or ''
''
>>> '' or False
False

and 结果为 True 时: 返回最后一个 'True' 的对象。

>>> True and 1
1
>>> 1 and True
True

and 结果为 False 时: 返回第一个 'False' 的对象。

>>> '' and False
''
>>> False and ''
False

这是一个重要的 Python 习惯用法,它让处理布尔逻辑时的代码更加简洁和紧凑。

>>> bool([])
False
>>> bool([0])
True
>>> bool({})
False
>>> bool({False: False})
True
>>> bool(0)
False
>>> bool(-1)
True
>>> bool('False')
True
>>> bool('')
False

基本上,'空' 对象被视为 False,'非空' 对象被视为 True。

结合 @detly 的回答和其他答案,可以帮助你更好地理解如何在 Python 中使用 if 和布尔值。

99

你其实不需要去比较布尔值(也就是真和假)。如果你写了这样的代码:

if some_bool == True:
  ...

...你只需要把它改成:

if some_bool:
  ...

不需要用 is==

不过,有些评论者提到,确实有合理的情况需要比较布尔值。如果你有两个布尔值都不知道它们的值,而你想知道它们是否相等,那么你应该用 ==!=,而不是用 isis not(下面会解释原因)。需要注意的是,这在逻辑上等同于 xnorxor,但在Python中并没有这两个逻辑运算符。

在内部,布尔值应该只有 两个布尔字面量对象(你也可以查看 C API),并且 bool(x) is True 应该等于 True,如果 bool(x) == True 对于任何Python程序都是成立的。不过有两个注意事项:

  • 并不意味着 如果 x == True,那么 x is True 也是成立的(比如 x = 1 的情况)。
  • 这对于Python的常见实现(CPython)是正确的,但在其他实现中可能不成立。因此,== 是更可靠的比较方式。

撰写回答