3

私のPythonIDEPyCharmは、デフォルトで次のPython行を変更することを提案しています。

if variable != 0:

if variable is not 0:

なぜそれがこれを示唆しているのですか?実行にはまったく問題がありますか(つまり、これはどのエッジケースでも異なる動作をしますか)?

4

4 に答える 4

7

バグです。IDで整数をテストしないでください。小さい整数でも問題なく動作する可能性がありますが、これは実装の詳細にすぎません。

あなたがチェックvariable is Falseしていたなら、それは大丈夫でしょう。おそらく、IDEはセマンティクスによってトリップされます

于 2012-06-27T07:10:06.907 に答える
1

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
于 2012-06-27T07:06:05.640 に答える
1

!=演算子は、値が等しくないかどうかをチェックします。演算子は、isIDを確認するために使用されます。Pythonでは、同じ整数リテラルの2つのインスタンスを持つことはできないため、式は同じ効果を持ちます。読みはis not 0英語に似ているので、おそらくIDEがそれを提案しているのです(私は推奨を受け入れませんが)。

私はいくつかの分析を試みました。両方の式のバイトコードをダンプしましたが、オペコードに違いは見られません。1つは持ってCOMPARE_OP 3 (!=)おり、もう1つは持っていCOMPARE_OP 9 (is not)ます。それらは同じです。次に、いくつかのパフォーマンスを実行してみたところ、にかかる時間は無視できるほど長いことがわかりました!=

于 2012-06-27T07:17:50.830 に答える
0

演算子「isnot」はオブジェクトの同一性をチェックし、演算子!=はオブジェクトの同等性をチェックします。私はあなたがあなたの場合にこれをするべきだとは思いませんが、多分あなたのアイデアは一般的な場合にこれを示唆していますか?

于 2012-06-27T07:10:30.667 に答える