将'=='替换为'is'比较布尔值是否安全
我做了一些布尔比较:
>>> (True or False) is True
True
>>> (True or False) == True
True
听起来 ==
和 is
在布尔值上是可以互换使用的。
有时候用 is
更清楚一些。
我想知道:
True
和 False
在 Python 中是预先分配好吗?
bool(var)
的返回值总是和预先分配的 True
(或 False
)相同吗?
用 is
来比较布尔值是否安全?
这不是关于最佳实践的问题。
我只是想知道真相。
7 个回答
没错。在Python中,布尔值只有两个,分别是True和False:
布尔类(bool)不能被进一步继承。它的唯一实例就是False和True。
这意味着如果你知道两个操作数都是布尔值,那么==
和is
的效果是一样的。不过,正如detly所提到的,通常在这种情况下没有必要使用这两者中的任何一个。
注意你可能在比较的其他内容。
>>> 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
和布尔值。
你其实不需要去比较布尔值(也就是真和假)。如果你写了这样的代码:
if some_bool == True:
...
...你只需要把它改成:
if some_bool:
...
不需要用 is
或 ==
。
不过,有些评论者提到,确实有合理的情况需要比较布尔值。如果你有两个布尔值都不知道它们的值,而你想知道它们是否相等,那么你应该用 ==
或 !=
,而不是用 is
或 is not
(下面会解释原因)。需要注意的是,这在逻辑上等同于 xnor
和 xor
,但在Python中并没有这两个逻辑运算符。
在内部,布尔值应该只有 两个布尔字面量对象(你也可以查看 C API),并且 bool(x) is True
应该等于 True
,如果 bool(x) == True
对于任何Python程序都是成立的。不过有两个注意事项:
- 这 并不意味着 如果
x == True
,那么x is True
也是成立的(比如x = 1
的情况)。 - 这对于Python的常见实现(CPython)是正确的,但在其他实现中可能不成立。因此,
==
是更可靠的比较方式。