「変数」または「変数はNoneではありません」 [重複] 質問する

「変数」または「変数はNoneではありません」 [重複] 質問する
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しますFalse0

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_CONSTNoneまた、何らかの方法で定数を再バインドしたりNone、定数の値を変更したりした場合でもNone(ヒープ全体をctypes? で踏みつぶすなど)、最初の方法の方が動作する可能性が高くなります。ただし、どちらも問題にはなりません。また、問題になったとしても、まったくコードが高速化され、信頼性がさらに高まることはありません。

おすすめ記事