"is" 和 "id" 在 Python 3.5

"is" and "id" in Python 3.5

我有问题: 我使用的是 python 3.5 , win7-32​​bit 系统.

这是我的代码:

a=3
b=3
print(id(a))
print(id(b))

它returns:

1678268160
1678268160

所以我们可以知道 a 和 b 引用同一个对象。

但是问题来了:

a=3
b=3
print( id(a) is id(b) )

它return :

False

我不明白为什么会这样,我想这应该是真的。 谁能给我解释一下? 谢谢!

id(a) is id(b)比较id函数返回的id的id.

id(a) == id(b) 将是 True,因为 a is b 并且在对象的生命周期中,id 返回的值将始终相同。但是,每次调用 id 时,都会返回一个不同的整数(具有相同的值),因此 id(a) is id(b)False

id returns 一个 Python int 对象(你正在 id-ing 的对象的内存地址,尽管这是一个实现细节).但是除了非常小的 ints(同样是实现细节),Python 中没有 int 缓存;如果您以两种方式计算相同的 int,则两个不同的 int 对象恰好具有相同的值。同样,每次调用 id 都会创建一个新的 int,即使对象是相同的。

idis 的等价性是 a is b 意味着 id(a) == id(b),而不是 id(a) is id(b)(事实上,因为 id s 是大数,id(a) is id(b) 几乎总是 False).

另请注意,您的测试用例在其他方面存在缺陷:

a = 3
b = 3
a is b

只有 returns True 用于 is 比较,因为 CPython 中的小 int 缓存;如果你完成了:

a = 1000
b = 1000
a is b

a is b 将是 False;您关于身份的假设仅在 CPython 中适用于 -5 到 256 范围内的数字,出于性能原因,它们是单例,但所有其他 ints 都是根据需要重新创建的,而不是单例。