用'is'替换'=='来比较布尔值是否安全

时间:2011-01-04 06:16:51

标签: python

我做了几次布尔比较:

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

听起来==is可以互换布尔值。

有时使用is

会更清楚

我想知道:

是否在python中预先分配了TrueFalse

bool(var)是否始终使用预先分配的True(或False)返回相同的True(或False)?

==替换为is以比较布尔值是否安全?


这不是最佳实践。

我只是想知道真相。

7 个答案:

答案 0 :(得分:50)

你可能不需要比较布尔值。如果您正在做类似的事情:

if some_bool == True:
  ...

...只需将其更改为:

if some_bool:
  ...

不需要is==

正如评论者指出的那样,有正当理由比较布尔值。如果两个布尔值都是未知的并且您想知道一个是否与另一个相等,则应使用==!=而不是isis not(原因在于解释下面)。请注意,这在逻辑上分别等同于xnorxor,它们在Python中不作为逻辑运算符存在。

在内部,只有two boolean literal objects {另请参阅C API),bool(x) is True True如果bool(x) == True适用于任何Python程序。两个警告:

  • 这个并不意味着x is True如果x == True,(例如x = 1)。
  • 这适用于Python(CPython)的常规实现,但在其他实现中可能不适用。因此,==是一种更可靠的比较。

答案 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)

似乎所有答案都与解释器启动后定义的TrueFalse相关。在布尔值成为Python的一部分之前,它们通常被定义为程序的一部分。即使是现在(Python 2.6.6),它们只是可以指向不同对象的名称:

>>> True = 1
>>> (2 > 1)
True
>>> (2 > 1) == True
True
>>> (2 > 1) is True
False

如果您必须处理较旧的软件,请注意这一点。

答案 4 :(得分:1)

答案 5 :(得分:1)

==is都是比较运算符,它们会返回一个布尔值 - TrueFalse。 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 ==的另一个原因是NoneFalse均为“falsy”值。有时在考虑将NoneTrue的值与之配合使用时,使用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”