Variable = None
特定のシナリオでは、これら 3 つに違いはありますか? 違いがない場合、どれを使用するのがより適切ですか?
if Variable:
print "Hello world"
そして
if Variable is not None:
print "Hello world"
そして
if Variable != None:
print "Hello world"
変数なしの場合も同じですか?
ベストアンサー1
特定のシナリオでは、これら 3 つに違いはありますか?
最初は、変数が偽であるかどうかを尋ねます。このテストは、、、空のシーケンスなどを除くすべての場合に失敗None
しますFalse
。0
2 番目は、それがマジック シングルトン定数であるかどうかを尋ねますNone
。これは、それ自体に対してのみ失敗しますNone
。
3 番目は、 が と等しいとみなすものであるかどうかを尋ねますNone
。これは、たとえば の場合に失敗します。Holder(None)
ここで、 は、Holder
インスタンスが保持しているものと等しいとみなされるラッパー クラスです。または、あまり現実的ではありませんが、短いコード例を示します。
class Stupid(object):
def __ne__(self, other):
return False
Variable = Stupid()
最後のものはあまり役に立ちません。実際、== None
または をチェックする必要があるかもしれないと思ったことがあり!= None
、特に透過的なラッパー クラスなどを作成していない場合は、おそらく実際に必要だったのは またはis None
ですis not None
。しかし、他の 2 つはどちらも非常に役立ち、一般的です。
違いがない場合、どちらを使用するのがより適切でしょうか?
さて、は違いはあり、どちらがより適しているかは具体的な用途によって異なります。
質問の最後では、 がVariable
確実に である特定のケースで違いがあるかどうかを尋ねているようですNone
。その場合、もちろん 3 つに機能的な違いはありません。* すべて false であることが保証されているため、何も行いません。つまり、3 つのうちのどれかと、まったくコードを書かない場合とで違いはありません。その方がはるかにシンプルで、読みやすく、高速です。
* パフォーマンスの違いがあります。最初の方法では、 を使用したり、比較演算子を呼び出したりする必要はありませんLOAD_CONST
。None
また、何らかの方法で定数を再バインドしたりNone
、定数の値を変更したりした場合でもNone
(ヒープ全体をctypes
? で踏みつぶすなど)、最初の方法の方が動作する可能性が高くなります。ただし、どちらも問題にはなりません。また、問題になったとしても、まったくコードが高速化され、信頼性がさらに高まることはありません。