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

标签 python python-3.x internals

当我注意到 python(v3.6 及更早版本)和 (v3.7) 之间的行为不一致时,我正在向我的学生介绍 is 运算符。

启动 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.6 及更早版本与 3.7 中不可变对象(immutable对象)的 "is"行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54595477/

相关文章:

python - 如何在 python 中 pickle 一个动态创建的嵌套类?

python - 如何运行 Python 项目?

Python dict 到 MySQL 中executemany

python - 快速正则表达式 Python 3 不起作用

wpf - 如何访问 WPF ListView 的 ListViewItems?

C++11 内部 std::string 表示 (libstdc++)

python - 从文件中提取单词,然后列出文件以及包含这些单词的行号

Python 零值

python - 如何获取多个JSON对象的值?

java - 修改 rt.jar 的限制