默认情况下,我的python IDE PyCharm建议更改python的以下行:
if variable != 0:
到
if variable is not 0:
为什么会这样?执行是否重要(即,对于任何边缘情况,这是否有所不同)?
答案 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”正在检查对象标识和运算符!=检查对象是否相等。我不认为你应该在你的情况下这样做,但也许你的想法建议一般的情况?