为了避免相同文字的两次出现是否是同一个对象的问题(这是一个实现细节),让我们为我们的值命名,以便相同的名称始终引用同一个对象。
>>> x = 5.3
>>> y = 5
我们可以看到,实际上,当您分别对已经是浮点数或整数的值调用floatorint构造函数时,它们并没有构造新对象,而是返回原始对象:
>>> x is float(x)
True
>>> y is int(y)
True
所以当然float(x) is float(x)会True,因为这和写作一样x is x。同样对于int(y) is int(y). 文档说“对于一般的 Python 对象x,float(x)委托给x.__float__()”和“如果x定义__int__(),则int(x)返回x.__int__()”,这是有道理的,float.__float__两者int.__int__都只返回对象本身。
但是,当您对同一个值float多次调用构造函数时,每次都在构造一个新对象:int
>>> y1 = float(y)
>>> y2 = float(y)
>>> y1 is y2
False
但这是一个实现细节。解释器将被允许使用缓存来返回相同的float对象而不是构造多个对象,在这种int情况下,它实际上是这样做的,至少对于CPython中的小int值。
>>> x1 = int(x)
>>> x2 = int(x)
>>> x1 is x2
True