布尔标识== True vs为True

use*_*450 50 python pypy boolean jython cpython

使用if foo is None而不是if foo == None测试值是否具体是标准惯例None.

如果你想确定一个值是否正确True(不仅仅是一个真实的值),是否有任何理由使用if foo == True而不是if foo is True?这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?

示例:say True用作要与值'bar'或任何其他类似真值的值区分开的单例值:

if foo is True: # vs foo == True
    ...
elif foo == 'bar':
    ...
Run Code Online (Sandbox Code Playgroud)

是否存在使用if foo is True会产生不同结果的情况if foo == True

注意:我知道Python布尔值 - 如果x:,则vs x == True,vs如果x为True.但是,它仅解决是否if foo,if foo == Trueif foo is True通常应用于确定是否foo具有真实值.


更新:根据PEP285§规范:

值False和True将是单例,如None.

Fer*_*yer 42

如果你想确定一个值是否完全为True(而不仅仅是一个类似于true的值),是否有任何理由使用if foo == True而不是foo为True?

如果要确保它foo确实是布尔值和值True,请使用is运算符.

否则,如果foo自己的实现类型__eq__()在比较时返回true-ish值True,则可能最终会出现意外结果.

根据经验,您应该始终使用is内置常量True,FalseNone.

这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?

从理论上讲,is将比==后者必须尊重类型的自定义__eq__实现更快,同时is可以直接比较对象标识(例如,内存地址).

我不知道各种Python实现的源代码,但我认为大多数可以通过使用一些内部标志来存在魔法方法来优化它,所以我怀疑你不会注意到速度差异在实践中.

  • 这对于非常广泛的库(如numpy)来说是错误的,这些库具有自己的布尔值版本. (5认同)
  • @pindakaas:不,这不是"错误的".这是对"如果你想确定一个值是否完全正确(不仅仅是真实值)"这一问题的答案.一些像numpy这样的库带有自己的"类似真实"类型的论点并不适用于此! (5认同)
  • 这个答案是错误的。你**绝对不**将“is”与“True”和“False”一起使用。PEP 8 明确禁止它。如果您愿意,可以使用“isinstance”检查*子类型*,然后使用对“__bool__”的隐式调用检查真实性,如下所示:“if x”。 (5认同)
  • 相关链接:https://www.python.org/dev/peps/pep-0008/#programming-recommendations。https://switowski.com/blog/checking-for-true-or-false (4认同)

kad*_*dee 21

切勿is True与numpy(以及熊猫等衍生物)结合使用:

In[1]: import numpy as np
In[2]: a = np.array([1, 2]).any()
In[4]: a is True
Out[4]: False
In[5]: a == True
Out[5]: True
Run Code Online (Sandbox Code Playgroud)

这对我来说意外:

In[3]: a
Out[3]: True
Run Code Online (Sandbox Code Playgroud)

我想解释是由:

In[6]: type(a)
Out[6]: numpy.bool_
Run Code Online (Sandbox Code Playgroud)

  • 相反,如果你想知道对象是否是Python的实际内置`True`对象,那么`is True`仍然是要走的路.NumPy布尔数组标量不是内置的"True"对象,无论它们是否假装,并且它们具有与实际布尔值相关的重要实现和行为差异. (4认同)
  • 我实际上同意您的观点:我个人更喜欢`is True',并在可能的地方使用它。但令我感到惊讶的是,它不适用于numpy / pandas,并认为在此处共享它很有用。 (3认同)

bru*_*ers 12

是否有任何理由使用if foo == True而不是foo为True?"

>>> d = True
>>> d is True
True
>>> d = 1
>>> d is True
False
>>> d == True
True
>>> d = 2
>>> d == True
False
Run Code Online (Sandbox Code Playgroud)

注意,它boolint,并且True具有整数值的子类1.要回答您的问题,如果要检查某个变量"是否为True",则必须使用identity运算符is.但这真的不是pythonic ......我想问你的真实用例是什么 - IOW:你为什么要在它们之间做出改变True,1或者是什么'真值'?

  • @brunodesthuilliers 不,不是。即将“== None”替换为“is None”。我在该差异中的任何地方都没有看到“True”这个词。 (2认同)

acu*_*ner 5

edit: regarding:

Is there a case where using if foo is True would yield different results from if foo == True?

there is a case, and it's this:

In [24]: 1 is True
Out[24]: False

In [25]: 1 == True
Out[25]: True
Run Code Online (Sandbox Code Playgroud)

additionally, if you're looking to use a singleton as a sentinel value, you can just create an object:

sentinel_time = object()

def f(snth):
    if snth is sentinel_time:
        print 'got em!'
f(sentinel_time)
Run Code Online (Sandbox Code Playgroud)

you don't want to use if var == True:, you really want if var:.

imagine you have a list. you don't care if a list is "True" or not, you just want to know whether or not it's empty. so...

l = ['snth']
if l:
    print l
Run Code Online (Sandbox Code Playgroud)

check out this post for what evaluates to False: Evaluation of boolean expressions in Python

  • OP 明确指出“如果你想确定一个值是否完全正确(不仅仅是一个类似真实的值)” (3认同)

tbr*_*ere 5

大多数情况下,使用foo is Trueif 代替foo == True(或仅使用) if 并不是您想要的。foo

\n

我见过foo is True用于检查参数是否foo确实是布尔值的。

\n
    \n
  1. 它与 python 的鸭子类型哲学相矛盾(通常不应该检查类型。对于假设鸭子类型的程序员来说,与其他真值不同的函数行为True是违反直觉的)
  2. \n
  3. 即使您想检查类型,最好明确地执行此操作,例如:
  4. \n
\n
def myFunction(foo):\n    if not isinstance(foo, bool):\n        raise ValueError("foo should be a boolean")\n>>> myFunction(1)\nException: ValueError "foo should be a boolean"\n
Run Code Online (Sandbox Code Playgroud)\n

有几个原因:

\n
    \n
  • isBool 是运算符等效于 的唯一类型isinstance(a, bool) and a。原因是TrueFalse单例。换句话说,这是因为 python 的一个鲜为人知的功能(特别是当一些教程教您时,TrueandFalse只是1和的别名0)。
  • \n
  • 如果你使用 isinstance并且程序员不知道你的函数不接受真值,或者如果他们正在使用numpy并且忘记将他们的 numpy-boolean 转换为 python-boolean,他们会知道他们做错了什么,并且会被能够调试。
  • \n
\n

与之比较

\n
def myFunction(foo):\n    if foo is True:\n       doSomething()\n    else:\n       doSomethingElse()\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,myFunction(1)不仅不会引发异常,而且可能会执行与预期相反的操作。例如,如果有人使用 numpy 布尔值,这将很难发现错误。

\n

什么时候应该使用is Truethen\xe2\x80\xaf?

\n

编辑:请不要\xe2\x80\x99t。正如另一个答案的评论中提到的, PEP 8明确建议反对它\xe2\x80\x99 。

\n

编辑:这是不好的做法is,从 3.9 开始,当您尝试使用与文字进行比较时,python 会发出警告。请参阅下面@JayDadhania 的评论。综上所述is不应用于与文字进行比较,仅用于检查内存地址的相等性。

\n

只是不要使用它。如果您需要检查类型,请使用isinstance.

\n

旧段落:

\n

基本上,仅将其用作isinstance(foo, bool) and foo

\n

我看到的唯一情况是,当您明确想要检查某个值是否为 true 时,并且稍后您还将检查该值是否是另一个 true 值。示例包括:

\n
def myFunction(foo):\n    if foo is True:\n       doSomething()\n    else:\n       doSomethingElse()\n
Run Code Online (Sandbox Code Playgroud)\n