为什么以下在Python中出现意外行为?
>>> a = 256
>>> b = 256
>>> a is b
True # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False # What happened here? Why is this False?
>>> 257 is 257
True # Yet the literal numbers compare properly
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 2.5.2.尝试一些不同版本的Python,似乎Python 2.3.3显示了99到100之间的上述行为.
基于以上所述,我可以假设Python在内部实现,使得"小"整数以不同于大整数的方式存储,is运算符可以区分.为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?
Python 3.8(或 CPython 3.8?)添加了警告
SyntaxWarning: "is" with a literal. Did you mean "=="?
Run Code Online (Sandbox Code Playgroud)
对于代码0 is 0。
我理解的警告,我知道之间的区别is和==。
但是,我也知道 CPython 会缓存小整数的对象并在其他情况下共享它。(出于好奇,我再次检查了代码(标头)。小整数被缓存在tstate->interp->small_ints. 中
0,1并且更加特殊,并且全局存储在_PyLong_Zero和 中_PyLong_One。所有新创建的ints 都是 viaPyLong_FromLong并且首先检查它是否是一个小整数整数和缓存。)
鉴于这种背景,如果你知道你有一个int对象,你可以说支票x is 0应该是安全的,对吧?此外,您可以推导出0 is 0应该始终是True,对吗?或者这是 CPython 的一个实现细节而其他解释器没有遵循这个?哪个解释器不遵循这个?
尽管这个更通用的问题(我只是好奇),请考虑这个更具体的(示例)代码:
def sum1a(*args):
y = 0
for x in args:
if y is 0:
y = x …Run Code Online (Sandbox Code Playgroud)