3

默认情况下,我的 python IDE PyCharm 建议更改以下 python 行:

if variable != 0:

if variable is not 0:

为什么会这样建议?执行是否重要(即,对于任何边缘情况,这是否表现不同)?

4

4 回答 4

7

这是一个错误。您不应该按身份测试整数。虽然它可能适用于小整数,但这只是一个实现细节。

如果你在检查variable is False,那就没问题了。也许IDE被语义绊倒了

于 2012-06-27T07:10:06.907 回答
1

is not如果您的匹配对象的身份不相等,则应该首选。看这些例子

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

!= 运算符检查值的不相等性。is运算符用于检查身份。在 Python 中,不能有两个相同整数文字的实例,因此表达式具有相同的效果。is not 0读起来更像英语,这可能是 IDE 建议它的原因(尽管我不会接受这个建议)。

我确实尝试了一些分析。我为这两个表达式转储了字节码,并且看不到操作码有任何区别。一个有COMPARE_OP 3 (!=),另一个有COMPARE_OP 9 (is not)。他们是一样的。然后我尝试了一些性能运行,发现!=.

于 2012-06-27T07:17:50.830 回答
0

运算符“不是”检查对象身份,运算符 != 检查对象相等性。我认为你不应该在你的情况下这样做,但也许你的 ide 建议在一般情况下这样做?

于 2012-06-27T07:10:30.667 回答