python 3.6及更早版本与3.7中不可变对象的"is"行为不一致

Ehs*_*san 3 python internals python-3.x

我被介绍运营商给我的学生时,我注意到,在Python(3.6版以上)和(3.7版)之间的行为不一致.

启动python shell并运行:

5/2 is 2.5
Run Code Online (Sandbox Code Playgroud)

要么:

(1, 2, 3) is (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

在v3.6.X中,你得到False了两者,但在v3.7中他们结果是True.

我的期望是结果应该是True,因为我认为不可变数字对象(或它们的元组)只有一个实例.

似乎至少我的想法在以前的Python版本中是不对的.

有谁知道解释这种新行为的变化是什么?

Sla*_*lam 5

我不确定原因和来源,但我的猜测是这与内联优化有关.

如果您为此值分配变量,将导致身份检查False,与之前相同.

>>> 5/2 is 2.5
True
>>> a = 5/2
>>> a is 2.5
False
Run Code Online (Sandbox Code Playgroud)

关于新折叠优化的有趣注释.由于python是"所有运行时",因此没有办法优先处理某些事情,但它会尽力解决,尽可能多地解析范围:

>>> a = 3.14
>>> b = 3.14
>>> a is b
False
>>> a = 3.14; b = 3.14
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)