web-dev-qa-db-ja.com

ブールID == True vs is True

値がNoneであるかどうかをテストするために、if foo is Noneではなくif foo == Noneを使用することが標準的な規則です。

値が正確にTrue(真のような値ではない)かどうかを判断したい場合、if foo == Trueではなくif foo is Trueを使用する理由はありますか?これは、CPython(2.xおよび3.x)、Jython、PyPyなどの実装ごとに異なりますか?

例:Trueは、値'bar'またはその他の真の値と区別するシングルトン値として使用されます。

if foo is True: # vs foo == True
    ...
Elif foo == 'bar':
    ...

if foo is Trueを使用するとif foo == Trueと異なる結果が生じる場合がありますか?

注: Pythonブール値-if x :, vs if x == True、vs if x is True を認識しています。ただし、fooがtrueのような値を持つかどうかを判断するために、一般的にif fooif foo == True、またはif foo is Trueのいずれを使用するかのみを扱います。


更新: PEP 285 に従って§仕様:

値FalseおよびTrueは、なしなどのシングルトンになります。

46
cpburnz

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

これは私にとって予想外でした:

In[3]: a
Out[3]: True

説明は次のように与えられていると思います。

In[6]: type(a)
Out[6]: numpy.bool_
19
kadee

fooがTrueの場合ではなく、foo == Trueの場合に使用する理由はありますか?」

>>> d = True
>>> d is True
True
>>> d = 1
>>> d is True
False
>>> d == True
True
>>> d = 2
>>> d == True
False

boolintのサブクラスであり、Trueは整数値1。質問に答えるために、変数が「正確にTrue」であることを確認する場合は、ID演算子isを使用する必要があります。 しかしそれは本当にPythonicではありません...あなたの本当のユースケースは何ですか?-IOW:なぜTrue1または任意の「真の」値?

11

ほとんどの場合、このような詳細を気にする必要はありません。 fooがブール値であることを既に知っているか(したがって、if fooを使用できます)、またはfooが他のものであることを知っています(この場合、テストする必要はありません) 。変数のタイプがわからない場合は、コードをリファクタリングすることをお勧めします。

しかし、本当にそれがTrueであり、それ以外のことを確認する必要がある場合は、isを使用してください。 ==を使用すると、1 == Trueが得られます。

1
Kevin

Trueの3つのテスト形式の違いを確認できるテストを次に示します。

for test in ([], [1], 0, 1, 2):
    print repr(test), 'T' if test else 'F', 'T' if test == True else 'F', 'T' if test is True else 'F'

[] F F F
[1] T F F
0 F F F
1 T T F
2 T F F

ご覧のとおり、すべてが異なる結果をもたらす場合があります。

0
Mark Ransom

edit:re is True vs ==

ケースがあり、それはこれです:

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

In [25]: 1 == True
Out[25]: True

また、センチネル値としてのシングルトンについては、クラスを使用できます

class SentinelTime(object): pass

def f(snth):
    if snth is SentinelTime:
        print 'got em!'
f(SentinelTime)

if var == True:を使用したくない場合、if var:が本当に必要です。

リストがあると想像してください。リストが「True」であるかどうかは関係ありません。リストが空かどうかを知りたいだけです。そう...

l = ['snth']
if l:
    print l

Falseに評価されるものについては、この投稿を確認してください。 Pythonでのブール式の評価

0
acushner