Variable = None
特定のシナリオでこれら3つの間に違いはありますか?どちらを使用するのが適しているかという違いがない場合はどうなりますか?
if Variable:
print "Hello world"
と
if Variable is not None:
print "Hello world"
と
if Variable != None:
print "Hello world"
なし変数の場合も同じですか?
Variable = None
特定のシナリオでこれら3つの間に違いはありますか?どちらを使用するのが適しているかという違いがない場合はどうなりますか?
if Variable:
print "Hello world"
と
if Variable is not None:
print "Hello world"
と
if Variable != None:
print "Hello world"
なし変数の場合も同じですか?
特定のシナリオでこれら3つの間に違いはありますか?
最初の質問は、変数が偽物であるかどうかを尋ねます。None
このテストは、<code> False 、、0
空のシーケンスなど以外のすべての種類で失敗します。
2つ目は、それが魔法のシングルトン定数であるかどうかを尋ねNone
ます。これはそれ自体でのみ失敗しNone
ます。
3つ目は、それ自体がに等しいと見なすものかどうかを尋ねNone
ます。これは、たとえば、インスタンスが保持しているものと同等に比較されるラッパークラスの場合Holder(None)
は失敗します。Holder
または、あまり現実的ではありませんが、コード例を短くするには、次のようにします。
class Stupid(object):
def __ne__(self, other):
return False
Variable = Stupid()
最後のものはめったに役に立ちません。== None
実際、またはをチェックする必要があるかもしれないと思っていて、特に透過ラッパークラスなどを作成していない場合は、おそらく実際にまたは!= None
を望んでいました。しかし、他の2つは非常に便利で一般的です。is None
is not None
どちらを使用するのが適しているかという違いがない場合はどうなりますか?
さて、違いがあり、どちらがより適切であるかは、特定の用途によって異なります。
Variable
質問の最後に、間違いなくある特定のケースに違いがあるかどうかを尋ねているようですNone
。その場合、もちろん、3つの間に機能的な違いはありません。*これらはすべてfalseであることが保証されているため、何もしません。つまり、3つのいずれにも違いはなく、コードをまったく記述していません。これは、はるかに単純で、読みやすく、高速です。
LOAD_CONST
*パフォーマンスの違いがあります。最初の違いはNone
、、または比較演算子を呼び出す必要はありません。また、なんらかの方法で定数の値を再バインドNone
または変更した場合でもNone
(おそらく、ヒープ全体をctypes
?で踏みつけることによって)、最初の定数が機能する可能性が高くなります。しかし、どちらも問題になることはありません。問題が発生したとしても、これ以上高速で信頼性の高いコードはありません。
not x
、、、、などの場合x
はtrueになります。None
False
[]
{}
x is not None
True
変数が実際にである場合を除き、常に。になりNone
ます。
編集:
これは、変数が実際に適切な値に設定されているかどうかを確認する場合は常に重要です。そうしないと、問題が発生する可能性があります。たとえば、アイテムのリストを評価して次のことを行う場合:
if not x:
リストが提供されたかどうかを確認するために、条件は空のリストでトリガーされますが、これはまだ有効な入力である可能性があります。その場合は、
if x is not None:
空のリストを有効な入力として許可しますが、リストがまったく提供されていないかどうかを確認します。
そのような値は、特定の言語のまたはの値にNone
相当します。これは、定義された変数に値がないためのプレースホルダーです(定義されていない場合は、をスローします)。そのため、値がデフォルト値として使用される場合があります。null
nil
NameError
None
>>> def foo():
... pass
...
>>> x = foo()
>>> x is None
True
これは、オプションの変数のデフォルト値としても頻繁に使用されます。
>>> def foo(bar=None):
... if bar is None:
... print('No argument passed.')
... else:
... print('Variable bar: %s' % str(bar))
...
>>> foo(0)
Variable bar: 0
>>> foo()
No argument passed.
このように、0
はまだ有効な値であり、でFalse
チェックすると評価されますif not bar:
。
PEP 8の公式の推奨事項は、IDチェックを使用してNoneをテストすることです。
if Variable is not None:
print "Hello world"
等式/不等式テストも機能しますが、速度が遅く、慣用的ではありません。
if Variable != None:
print "Hello world"
変数のブール値をテストすると、異なる結果が生成されます。次のテストでは、変数が空のコンテナーまたはゼロに等しい数値の場合、「helloworld」が出力されます。
# Hello world won't print for any of these values:
for Variable in (), '', u'', {}, [], 0, 0.0, 0j, None:
if Variable:
print "Hello world"
彼らは違う。に評価されるかどうかをnot
確認します。bool(var)
False
例えば。
>>> not ''
True
>>> not 'abc'
False
>>> not 0
True
if x is None
xがNone
それ自体であるかどうかをチェックします。