关于python:用’is’替换’==’来比较布尔值是否安全

Is it safe to replace '==' with 'is' to compare Boolean-values

我做了几个布尔比较:

1
2
3
4
>>> (True or False) is True
True
>>> (True or False) == True
True

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

有时候使用is会更清楚

我想知道:

是否在python中预先分配了TrueFalse

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

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

这不是最佳实践。

我只是想知道真相。


你可能不需要比较布尔值。如果你做的事情如下:

1
2
if some_bool == True:
  ...

......只需将其更改为:

1
2
if some_bool:
  ...

不需要is==

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

在内部,应该只有两个布尔文字对象(另请参阅C API),对于任何Python程序,如果bool(x) == Truebool(x) is True应该是True。两个警告:

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


留意你可能会比较的其他内容。

1
2
3
4
>>> 1 == True
True
>>> 1 is True
False

True和False将在python实例中为其生命周期提供稳定的对象ID。

1
2
3
4
>>> id(True)
4296106928
>>> id(True)
4296106928

is比较对象的id

编辑:添加or

由于OP正在使用or,因此可能值得指出这一点。

或者评估为True:返回第一个'True'对象。

1
2
3
4
5
6
>>> 1 or True
1
>>> 'a' or True
'a'
>>> True or 1
True

或者评估False:返回最后一个'False'对象

1
2
3
4
>>> False or ''
''
>>> '' or False
False

并且计算结果为True:返回最后一个'True'对象

1
2
3
4
>>> True and 1
1
>>> 1 and True
True

并且计算结果为False:返回第一个'False'对象

1
2
3
4
>>> '' and False
''
>>> False and ''
False

这是一个重要的python习惯用法,它允许简洁而紧凑的代码来处理常规python对象上的布尔逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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的见解。


是。保证恰好有两个bool s,True和False:

Class bool cannot be subclassed
further. Its only instances are False
and True.

这意味着如果您知道两个操作数都是bool,则==is是等效的。但是,正如det det地说,在这种情况下通常没有理由使用。


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

1
2
3
4
5
6
7
>>> True = 1
>>> (2 > 1)
True
>>> (2 > 1) == True
True
>>> (2 > 1) is True
False

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


==is都是比较运算符,它们将返回一个布尔值 - TrueFalse。 True的数值为1,False的数值为0。

运算符==比较两个对象的值和比较的对象通常是相同的类型(int vs int,float vs float),如果比较不同类型的对象,则它们是不相等的。运算符is测试对象标识,如果x和y具有相同的id,则'x is y'为真。也就是说,它们是相同的对象。

因此,当您比较相同类型的返回值时,使用==并且如果您要比较两个对象是否相同(无论是布尔值还是其他任何对象),您可以使用is

42 is 42为True且与42 == 42相同。


==运算符测试相等性是对象标识的关键字测试。我们是否在谈论同一个对象。注意,更多变量可以引用同一个对象。