编程语言
首页 > 编程语言> > python 3.6及更早版本与3.7中不可变对象的“is”行为不一致

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

作者:互联网

当我注意到python(v3.6和更早版本)和(v3.7)之间的行为不一致时,我向我的学生介绍了操作符.

启动python shell并运行:

5/2 is 2.5

要么:

(1, 2, 3) is (1, 2, 3)

在v3.6.X中,两者都得到False,但在v3.7中,它们都是True.

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

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

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

解决方法:

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

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

>>> 5/2 is 2.5
True
>>> a = 5/2
>>> a is 2.5
False

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

>>> a = 3.14
>>> b = 3.14
>>> a is b
False
>>> a = 3.14; b = 3.14
>>> a is b
True

标签:python,python-3-x,internals
来源: https://codeday.me/bug/20190717/1485982.html