gpt4 book ai didi

python - float() 对象 ID 创建顺序

转载 作者:太空狗 更新时间:2023-10-29 22:24:15 25 4
gpt4 key购买 nike

float(1.0) is float(1.0) #True
float(1) is float(1) #False

我已经将这里的 float() 奇怪之处与对象创建顺序隔离开来,因为

x1 = float(1)
x2 = float(1)
x1 is x2 #False
id(x1) == id(x2) #False
y1 = float(1.0)
y2 = float(1.0)
y1 is y2 #True
id(y1) == id(y2) #True

注意:我已经检查了 float 的精度,这不是发生这种情况的原因。

我想了解 Python 为何以及如何决定创建浮点对象。为什么 float(1.0) 指向同一个对象,而 float(1) 指向 2 个不同的对象,当其中一个被创建两次时?

另外,进一步引用:

float(1) is float(1) #False
id(float(1)) == id(float(1)) #True
float(1.0) is float(1.0) #True
id(float(1.0)) == id(float(1.0)) #True

最佳答案

>>> float(1.0) is float(1.0)
True

那是因为 float 返回对象本身,因为它已经是一个 float (对于字符串 BTW Should I avoid converting to a string if a value is already a string? 也是一样)。

检查 source code确认(添加评论):

static PyObject *
float_float(PyObject *v)
{
if (PyFloat_CheckExact(v)) // if v is already a float, just increase reference and return the same object
Py_INCREF(v);
else
// else create a new float object using the input value
v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval);
return v;
}

并且在编译时可能会共享对文字 1.0 的引用(这是实现定义的,这是我能想到的唯一解释,Dunes answer 解释得更好),所以它与1.0 是 1.0

>>> float(1) is float(1)
False

Python 必须为每一侧创建浮点对象,所以它是不同的。没有像整数那样的任何 float 实习。

最后一个有趣的部分:

>>> id(float(1)) == id(float(2))
True

因为 float 对象在 id 被调用后被垃圾回收,所以 id 被重用,即使字面值是 不同如上例所示(如 Unnamed Python objects have the same idWhy is the id of a Python class not unique when called quickly? 中所示)。

关于python - float() 对象 ID 创建顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com