我做了几次布尔比较:
>>> (True or False) is True
True
>>> (True or False) == True
True
听起来==
和is
可以互换布尔值。
有时使用is
我想知道:
是否在python中预先分配了True
和False
bool(var)
是否始终使用预先分配的True
(或False
)返回相同的True
(或False
)?
将==
替换为is
以比较布尔值是否安全?
这不是最佳实践。
我只是想知道真相。
答案 0 :(得分:50)
你可能不需要比较布尔值。如果您正在做类似的事情:
if some_bool == True:
...
...只需将其更改为:
if some_bool:
...
不需要is
或==
。
正如评论者指出的那样,有正当理由比较布尔值。如果两个布尔值都是未知的并且您想知道一个是否与另一个相等,则应使用==
或!=
而不是is
或is not
(原因在于解释下面)。请注意,这在逻辑上分别等同于xnor
和xor
,它们在Python中不作为逻辑运算符存在。
在内部,只有two boolean literal objects {另请参阅C API),bool(x) is True
True
如果bool(x) == True
适用于任何Python程序。两个警告:
x is True
如果x == True
,(例如x = 1
)。==
是一种更可靠的比较。答案 1 :(得分:34)
注意您可能要比较的其他内容。
>>> 1 == True
True
>>> 1 is True
False
在python实例中,True和False将为其生命周期提供稳定的对象ID。
>>> id(True)
4296106928
>>> id(True)
4296106928
is
比较对象的id
编辑:添加or
由于OP正在使用or
,因此可能值得指出这一点。
或评估为True:会返回第一个“True”对象。
>>> 1 or True
1
>>> 'a' or True
'a'
>>> True or 1
True
或评估False:返回最后一个'False'对象
>>> False or ''
''
>>> '' or False
False
并且评估为True:返回最后一个'True'对象
>>> True and 1
1
>>> 1 and True
True
并且评估为False:会返回第一个'False'对象
>>> '' and False
''
>>> False and ''
False
这是一个重要的python习惯用法,它允许在常规python对象上处理布尔逻辑的简洁和紧凑的代码。
>>> bool([])
False
>>> bool([0])
True
>>> bool({})
False
>>> bool({False: False})
True
>>> bool(0)
False
>>> bool(-1)
True
>>> bool('False')
True
>>> bool('')
False
基本上'空'对象为假,'非空'为真。
将此与@ detly和其他答案相结合,可以提供一些有关如何在python中使用if
和bools的见解。
答案 2 :(得分:5)
是。有guaranteed正好两个bool
s,是和否:
类bool不能被子类化 进一步。它唯一的例子是假的 和真的。
这意味着如果你知道两个操作数都是bool
,==
和is
是等价的。但是,正如这些情况一样,在这种情况下通常没有理由使用它们。
答案 3 :(得分:3)
似乎所有答案都与解释器启动后定义的True
和False
相关。在布尔值成为Python的一部分之前,它们通常被定义为程序的一部分。即使是现在(Python 2.6.6),它们只是可以指向不同对象的名称:
>>> True = 1
>>> (2 > 1)
True
>>> (2 > 1) == True
True
>>> (2 > 1) is True
False
如果您必须处理较旧的软件,请注意这一点。
答案 4 :(得分:1)
答案 5 :(得分:1)
==
和is
都是比较运算符,它们会返回一个布尔值 - True
或False
。 True的数值为1,False的数值为0.
运算符==
比较两个对象的值和比较的对象通常是相同的类型(int vs int,float vs float),如果比较不同类型的对象,则它们是不相等的。如果x和y具有相同的id,则运算符is
测试对象标识,'x is y'为真。也就是说,它们是相同的对象。
因此,当您比较是否比较相同类型的返回值时,请使用==,如果您要比较两个对象是否相同(无论是布尔值还是其他任何对象),您可以使用is
。
42 is 42
为True,与42 == 42
相同。
答案 6 :(得分:0)
compare values using ==
的另一个原因是None
和False
均为“falsy”值。有时在考虑将None
和True
的值与之配合使用时,使用False
将一个值标记为“未定义”或“无值”很有用:
def some_function(val = None):
"""This function does an awesome thing."""
if val is None:
# Values was not defined.
elif val == False:
# User passed boolean value.
elif val == True:
# User passed boolean value.
else:
# Quack quack.
一些相关的问题:Python != operation vs “is not”。