Python &引用;是";数字比较

Python &引用;是";数字比较,python,Python,我得到了一个Python测试,其中一个问题是:应该向以下函数传递什么,以便它返回True def fun(x): if x + 1 is 1 + x: return False if x + 2 is not 2 + x: return False return True 在我看来,这没有多大意义,但我只想知道正确的答案(如果存在这样的答案)。这与python缓存小数字的方式有关: 通常,is用于检查两个变量是否为同一对象,而不是它们是否

我得到了一个Python测试,其中一个问题是:应该向以下函数传递什么,以便它返回
True

def fun(x):
    if x + 1 is 1 + x:
        return False
    if x + 2 is not 2 + x:
        return False
    return True

在我看来,这没有多大意义,但我只想知道正确的答案(如果存在这样的答案)。

这与python缓存小数字的方式有关:


通常,
is
用于检查两个变量是否为同一对象,而不是它们是否具有相同的值。然而,由于python缓存小数字的方式,对-5到256之间的数字调用
is
与比较它们的效果相同。因此,如果
x+1
小于-5,但
x+2
大于或等于-5,则此函数返回true。这意味着将-7传递给这个函数将使它成功。

如果不以一种奇怪的方式编写我自己的实现加法的类,我看不出这是如何工作的。你让我好奇,Cpython缓存整数,这意味着一些人共享身份。当您有大于此范围的数字时,它们将是新创建的,因此具有不同的id。不记得确切的范围如果你对这种更奇怪的行为感兴趣,请检查一下,因为cpython缓存-5到256,我可能会很懒,让python找出答案:
[I for I in range(-10300)if fun(I)]
请参阅也不适用于我-对于Python3.8,6is-6返回true。5@Trilarion尝试将这些值分配给单独的variables@Trilarion如果您使用了
-6 is-6
,那就不同了,因为python为编译单元保留了这个数字。对于-600000也同样如此。这是有效的。无论x是什么,x都返回true。1+x是1+x不是。@SimonShkolnik-只要赋值在同一个.py文件中,它们仍然具有相同的id。