値が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 foo
、if foo == True
、またはif foo is True
のいずれを使用するかのみを扱います。
更新: PEP 285 に従って§仕様:
値FalseおよびTrueは、なしなどのシングルトンになります。
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_
fooがTrueの場合ではなく、foo == Trueの場合に使用する理由はありますか?」
>>> d = True
>>> d is True
True
>>> d = 1
>>> d is True
False
>>> d == True
True
>>> d = 2
>>> d == True
False
bool
はint
のサブクラスであり、True
は整数値1
。質問に答えるために、変数が「正確にTrue」であることを確認する場合は、ID演算子is
を使用する必要があります。 しかしそれは本当にPythonicではありません...あなたの本当のユースケースは何ですか?-IOW:なぜTrue
、1
または任意の「真の」値?
ほとんどの場合、このような詳細を気にする必要はありません。 foo
がブール値であることを既に知っているか(したがって、if foo
を使用できます)、またはfoo
が他のものであることを知っています(この場合、テストする必要はありません) 。変数のタイプがわからない場合は、コードをリファクタリングすることをお勧めします。
しかし、本当にそれがTrue
であり、それ以外のことを確認する必要がある場合は、is
を使用してください。 ==
を使用すると、1 == True
が得られます。
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
ご覧のとおり、すべてが異なる結果をもたらす場合があります。
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でのブール式の評価