私のPythonIDEPyCharmは、デフォルトで次のPython行を変更することを提案しています。
if variable != 0:
に
if variable is not 0:
なぜそれがこれを示唆しているのですか?実行にはまったく問題がありますか(つまり、これはどのエッジケースでも異なる動作をしますか)?
バグです。IDで整数をテストしないでください。小さい整数でも問題なく動作する可能性がありますが、これは実装の詳細にすぎません。
あなたがチェックvariable is False
していたなら、それは大丈夫でしょう。おそらく、IDEはセマンティクスによってトリップされます
is not
一致するオブジェクトのIDが等しくない場合は、優先する必要があります。これらの例を参照してください
>>> a=[1,2,3]
>>> b=[1,2,3] #both are eqaul
>>> if a is not b:
print('they are eqaul but they are not the same object')
they are eqaul but they are not the same object
>>> if a != b:
print('hello') #prints nothing because both have same value
>>> a=100000
>>> b=100000
>>> a is b
False
>>> if a is not b:
print('they are eqaul but they are not the same object')
they are eqaul but they are not the same object
>>> if a!=b:
print('something') #prints nothing as != matches their value not identity
ただし、aとbに格納されている数値が小さい整数または小さい文字列の場合a is not b
、Pythonがキャッシュを実行するため機能せず、両方とも同じオブジェクトを指します。
>>> a=2
>>> b=2
>>> a is b
True
>>> a='wow'
>>> b='wow'
>>> a is b
True
>>> a=9999999
>>> b=9999999
>>> a is b
False
!=演算子は、値が等しくないかどうかをチェックします。演算子は、is
IDを確認するために使用されます。Pythonでは、同じ整数リテラルの2つのインスタンスを持つことはできないため、式は同じ効果を持ちます。読みはis not 0
英語に似ているので、おそらくIDEがそれを提案しているのです(私は推奨を受け入れませんが)。
私はいくつかの分析を試みました。両方の式のバイトコードをダンプしましたが、オペコードに違いは見られません。1つは持ってCOMPARE_OP 3 (!=)
おり、もう1つは持っていCOMPARE_OP 9 (is not)
ます。それらは同じです。次に、いくつかのパフォーマンスを実行してみたところ、にかかる時間は無視できるほど長いことがわかりました!=
。
演算子「isnot」はオブジェクトの同一性をチェックし、演算子!=はオブジェクトの同等性をチェックします。私はあなたがあなたの場合にこれをするべきだとは思いませんが、多分あなたのアイデアは一般的な場合にこれを示唆していますか?