897

私はいつもif not x is Noneバージョンがもっと明確だと思っていましたが、GoogleのスタイルガイドPEP-8は両方ともを使用していますif x is not None。パフォーマンスにわずかな違いはありますか(私はそうではないと思います)、一方が実際に適合しない場合はありますか(もう一方が私のコンベンションの明確な勝者になります)?*

*私は単なる。ではなく、任意のシングルトンを指しNoneます。

...Noneのようなシングルトンを比較します。使用するかしないか。

4

9 に答える 9

1174

同じバイトコードにコンパイルされるため、パフォーマンスの違いはありません。

>>> import dis
>>> dis.dis("not x is None")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("x is not None")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

スタイル的に、私は避けるようnot x is yにしています。人間の読者はそれを と誤解するかもしれません(not x) is y。私が書くならx is not y、あいまいさはありません。

于 2010-04-26T03:55:04.673 に答える
333

GoogleとPythonの両方のスタイルガイドがベストプラクティスです。

if x is not None:
    # Do something about x

使用not xすると、望ましくない結果が生じる可能性があります。

下記参照:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

TruePythonで、またはFalsePythonでどのリテラルが評価されるかを確認することに興味があるかもしれません。


以下のコメントのために編集してください:

もう少しテストをしました。not x is None最初に否定せずx、次にと比較しNoneます。実際、このようisに使用すると、演算子の優先順位が高くなるようです。

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

したがって、not x is None私の正直な意見では、避けるのが最善です。


さらに編集:

さらにテストを行ったところ、bukzorのコメントが正しいことを確認できました。(少なくとも、それ以外の方法でそれを証明することはできませんでした。)

これif x is not Noneは、と正確な結果が得られることを意味しif not x is Noneます。私は正直に立っています。bukzorに感謝します。

しかし、私の答えはまだ残っています:従来のを使用してくださいif x is not None:]

于 2010-04-26T03:13:32.220 に答える
138

コードは、最初にプログラマーが理解できるように、次にコンパイラーまたはインタープリターが理解できるように作成する必要があります。「isnot」構文は、「notis」よりも英語によく似ています。

于 2010-04-26T03:15:55.180 に答える
38

パイソンif x is not Noneif not x is None

TLDR: バイトコード コンパイラは両方を解析してx is not None、読みやすくするためにif x is not None.

可読性

私たちが Python を使用するのは、パフォーマンスよりも人間の読みやすさ、使いやすさ、プログラミングのさまざまなパラダイムの正確さなどを重視するためです。

Python は、特にこのコンテキストで、読みやすさを最適化します。

バイトコードの解析とコンパイル

not バインドは よりも弱いためis、論理的な違いはありません。ドキュメントを参照してください:

オブジェクト同一性の演算子isand is nottest:x is yは、x と y が同じオブジェクトである場合にのみ true になります。x is not y逆の真理値が得られます。

は、言語の読みやすさの向上として、is notPython文法で具体的に提供されています。

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

そして、それは文法の統一要素でもあります。

もちろん、同じようには解析されません:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"

しかし、その後、バイト コンパイラは実際に を次のように変換not ... isis notます。

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

したがって、読みやすく、意図したとおりに言語を使用するために、 を使用してくださいis not

それを使わないのは賢明ではありません。

于 2015-07-20T16:18:17.683 に答える
32

答えは、人々が作っているよりも簡単です。

どちらの方法でも技術的な利点はなく、「x は y ではない」というのは他の誰もが使用するものであり、明らかに勝者となります。「英語に似ている」かどうかは問題ではありません。つまり、Python のすべてのユーザー (言語が Python に似ていない中国のユーザーでさえ) が一目で理解できるということです。

少なくともこの分野では、違うという理由だけで違うことをしないでください。

于 2010-04-26T07:18:03.083 に答える
15

個人的には、

if not (x is None):

これは、Python 構文の専門家でなくても、すべてのプログラマーが曖昧さなくすぐに理解できます。

于 2016-06-26T16:14:23.827 に答える
11

スタイル上の理由から、演算子はのis not結果を否定するよりも優先されます。isif x is not None:」は英語と同じように読めますが、「if not x is None:」は演算子の優先順位を理解する必要があり、英語のようには読めません。

パフォーマンスの違いがある場合、私のお金はis not. それは明らかに実装依存です。オーバーライドできないためis、とにかく区別を最適化するのは簡単なはずです。

于 2010-04-26T04:32:34.880 に答える
2

if not x is None他のプログラミング言語に似ていますがif x is not None、私には間違いなくより明確に聞こえます(そして英語ではより文法的に正しいです)。

そうは言っても、それは私にとってもっと好みのことのようです。

于 2010-04-26T03:14:29.227 に答える
1

x is not y はるかに読みやすいコードを生成するために、演算子のコード処理の優先順位を最終的にどのように記述するかを考えるよりも、読みやすい形式を好みます。

于 2015-09-24T07:19:34.627 に答える