【发布时间】:2019-02-08 15:21:11
【问题描述】:
我正在向我的学生介绍 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版本中是不对的。
有谁知道做出了哪些改变来解释这种新行为?
【问题讨论】:
-
在以前版本的 pyhton 中,浮点数不会被保留,这与小整数不同。元组也不是。
-
他们可能决定实习更多的东西。那又怎样?
-
我永远不会期望任何两个值是同一个对象,除非我自己明确地重新分配了对象 (
a = b; a is b)。其他任何事情都取决于特定实现的内部优化过程。 -
不要编写依赖于产生相同对象的相等文字的代码。除非你自己在某个地方写了
x = y,否则永远不要假设x is y可能是真的。 -
您只能安全地实习不可变对象,但这并不意味着所有不可变对象都已(或应该)实习。
标签: python python-3.x internals