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 == True或if 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,False和None.
这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
从理论上讲,is将比==后者必须尊重类型的自定义__eq__实现更快,同时is可以直接比较对象标识(例如,内存地址).
我不知道各种Python实现的源代码,但我认为大多数可以通过使用一些内部标志来存在魔法方法来优化它,所以我怀疑你不会注意到速度差异在实践中.
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)
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)
注意,它bool是int,并且True具有整数值的子类1.要回答您的问题,如果要检查某个变量"是否为True",则必须使用identity运算符is.但这真的不是pythonic ......我想问你的真实用例是什么 - IOW:你为什么要在它们之间做出改变True,1或者是什么'真值'?
edit: regarding:
Is there a case where using
if foo is Truewould yield different results fromif 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
foo is Trueif 代替foo == True(或仅使用) if 并不是您想要的。foo我见过foo is True用于检查参数是否foo确实是布尔值的。
True是违反直觉的)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"\nRun Code Online (Sandbox Code Playgroud)\n有几个原因:
\nisBool 是运算符等效于 的唯一类型isinstance(a, bool) and a。原因是True和False是单例。换句话说,这是因为 python 的一个鲜为人知的功能(特别是当一些教程教您时,TrueandFalse只是1和的别名0)。numpy并且忘记将他们的 numpy-boolean 转换为 python-boolean,他们会知道他们做错了什么,并且会被能够调试。与之比较
\ndef myFunction(foo):\n if foo is True:\n doSomething()\n else:\n doSomethingElse()\nRun Code Online (Sandbox Code Playgroud)\n在这种情况下,myFunction(1)不仅不会引发异常,而且可能会执行与预期相反的操作。例如,如果有人使用 numpy 布尔值,这将很难发现错误。
is Truethen\xe2\x80\xaf?编辑:这是不好的做法is,从 3.9 开始,当您尝试使用与文字进行比较时,python 会发出警告。请参阅下面@JayDadhania 的评论。综上所述is不应用于与文字进行比较,仅用于检查内存地址的相等性。
只是不要使用它。如果您需要检查类型,请使用isinstance.
旧段落:
\n基本上,仅将其用作isinstance(foo, bool) and foo
我看到的唯一情况是,当您明确想要检查某个值是否为 true 时,并且稍后您还将检查该值是否是另一个 true 值。示例包括:
\ndef myFunction(foo):\n if foo is True:\n doSomething()\n else:\n doSomethingElse()\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
35168 次 |
| 最近记录: |