为什么我的IDE建议重写!= 0 to not 0

时间:2012-06-27 07:03:18

标签: python pycharm

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

if variable != 0:

if variable is not 0:

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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会执行一些缓存,并且它们都指向同一个对象。 / p>

>>> a=2
>>> b=2
>>> a is b
True
>>> a='wow'
>>> b='wow'
>>> a is b
True
>>> a=9999999
>>> b=9999999
>>> a is b
False

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

运算符“is not”正在检查对象标识和运算符!=检查对象是否相等。我不认为你应该在你的情况下这样做,但也许你的想法建议一般的情况?