16
Variable = None

特定のシナリオでこれら3つの間に違いはありますか?どちらを使用するのが適しているかという違いがない場合はどうなりますか?

if Variable:
 print "Hello world"

if Variable is not None:
 print "Hello world"

if Variable != None:
 print "Hello world"

なし変数の場合も同じですか?

4

4 に答える 4

11

特定のシナリオでこれら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 Noneis not None

どちらを使用するのが適しているかという違いがない場合はどうなりますか?

さて、違いあり、どちらがより適切であるかは、特定の用途によって異なります。

Variable質問の最後に、間違いなくある特定のケースに違いがあるかどうかを尋ねているようですNone。その場合、もちろん、3つの間に機能的な違いはありません。*これらはすべてfalseであることが保証されているため、何もしません。つまり、3つのいずれにも違いはなく、コードをまったく記述していません。これは、はるかに単純で、読みやすく、高速です。

LOAD_CONST*パフォーマンスの違いがあります。最初の違いはNone、、または比較演算子を呼び出す必要はありません。また、なんらかの方法で定数の値を再バインドNoneまたは変更した場合でもNone(おそらく、ヒープ全体をctypes?で踏みつけることによって)、最初の定数が機能する可能性が高くなります。しかし、どちらも問題になることはありません。問題が発生したとしても、これ以上高速で信頼性の高いコードはありません。

于 2013-03-27T05:56:18.657 に答える
8

not x、、、、などの場合xはtrueになります。NoneFalse[]{}

x is not NoneTrue変数が実際にである場合を除き、常に。になりNoneます。

編集:

これは、変数が実際に適切な値に設定されているかどうかを確認する場合は常に重要です。そうしないと、問題が発生する可能性があります。たとえば、アイテムのリストを評価して次のことを行う場合:

if not x:

リストが提供されたかどうかを確認するために、条件は空のリストでトリガーされますが、これはまだ有効な入力である可能性があります。その場合は、

if x is not None:

空のリストを有効な入力として許可しますが、リストがまったく提供されていないかどうかを確認します。

そのような値は、特定の言語のまたはの値にNone相当します。これは、定義された変数に値がないためのプレースホルダーです(定義されていない場合は、をスローします)。そのため、値がデフォルト値として使用される場合があります。nullnilNameErrorNone

>>> 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:

于 2013-03-27T05:25:49.290 に答える
5

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"
于 2013-03-27T06:23:55.010 に答える
2

彼らは違う。に評価されるかどうかをnot確認します。bool(var)False

例えば。

>>> not ''
True
>>> not 'abc'
False
>>> not 0
True

if x is NonexがNoneそれ自体であるかどうかをチェックします。

于 2013-03-27T05:26:03.650 に答える