默认情况下,我的 python IDE PyCharm 建议更改以下 python 行:
if variable != 0:
至
if variable is not 0:
为什么会这样建议?执行是否重要(即,对于任何边缘情况,这是否表现不同)?
这是一个错误。您不应该按身份测试整数。虽然它可能适用于小整数,但这只是一个实现细节。
如果你在检查variable is False
,那就没问题了。也许IDE被语义绊倒了
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
!= 运算符检查值的不相等性。is
运算符用于检查身份。在 Python 中,不能有两个相同整数文字的实例,因此表达式具有相同的效果。is not 0
读起来更像英语,这可能是 IDE 建议它的原因(尽管我不会接受这个建议)。
我确实尝试了一些分析。我为这两个表达式转储了字节码,并且看不到操作码有任何区别。一个有COMPARE_OP 3 (!=)
,另一个有COMPARE_OP 9 (is not)
。他们是一样的。然后我尝试了一些性能运行,发现!=
.
运算符“不是”检查对象身份,运算符 != 检查对象相等性。我认为你不应该在你的情况下这样做,但也许你的 ide 建议在一般情况下这样做?