为什么 id(1) 是 id(1) 返回 False?

why is id(1) is id(1) returning False?

我知道is运算符比较的是两者的id,而不是value
但是,当您评估 id(1) 和 id(1) 时,对象(它是一个 int)彼此相等。

那么为什么返回 false?

id(1) # 27533656
id(1) is id(1) # False
type(id(1)) # int

那么,从技术上讲,将其推导为

id(1) is id(1)
27533656 is 27533656 # has to be True!

is 检查对象 identity== 检查对象 equality。差异可能很细微,但在处理列表等可变对象时最容易看出:

x = [1, 2, 3]
y = x[:]  # copy, not the same list
x is y  # False
x == y  # True

如果我向 x 添加内容,y 将看不到它:

x.append(4)
x == y  # now False since they have diverged.

但是,如果我为 x 添加别名并附加到它,别名也会看到更改:

z = x  # alias `z` to `x`
x.append(5)
x == z  # True

而之所以这样是因为zx.

z is x  # True

在这种情况下,1id 是一致的,因为 CPython1 缓存小整数以提高效率(因此对象文字 1 始终是同一个对象——因此也是同一个 Id)。但是,id 的 return 值实际上可以是具有等效值的 int 的不同实例。

1这是众所周知的 CPython 实现细节。其他实现(和未来版本)的行为不同,因此不要依赖此行为。

您稍微误解了 is 语法的作用。

你用那段代码做的大致是:

id(id(1)) == id(id(1))

因为id函数返回的值不是静态的,不能保证是同一个身份,它们很可能是不同的身份。

作为证明,当我将它们放入打印语句中时,我得到:

print id(id(1)) # 4327028
print id(id(1)) # 4326968

明显不一样

如果您将代码更改为:

if 1 is 1: # basically in this case id(1) == id(1)
    print "success"

你会发现这些值确实是同一个id。

如评论中所述。 x is xid(x) == id(x) 确定等价性的方法对于所有文字类型并不总是相同的。
在这个问题的特定情况下,它们可能被视为相等。