相关疑难解决方法(0)

"是"运算符与整数意外行为

为什么以下在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 int identity operators python-internals

476
推荐指数
11
解决办法
6万
查看次数

Python中的“0是0”总是“真”吗?

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. 中 01并且更加特殊,并且全局存储在_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)

python cpython python-3.x python-internals

9
推荐指数
1
解决办法
286
查看次数