[英]Why doesn't small integer caching seem to work with int objects from the round() function in Python 3?
你能解释一下为什么在 Python v3.8 中会发生这种情况吗?
a=round(2.3)
b=round(2.4)
print(a,b)
print(type(a),type(b))
print(a is b)
print(id(a))
print(id(b))
输出:
2 2
<class 'int'> <class 'int'>
False
2406701496848
2406701496656
>>>
2 在小整数缓存的范围内。 那么为什么会有不同的对象具有相同的值呢?
看起来在 3.8 中, PyLong_FromDouble
(这是float.__round__
最终委托给的) 显式分配一个新的PyLong
对象并手动填充它,而不对其进行规范化(通过IS_SMALL_INT
检查和get_small_int
缓存查找函数),因此它不检查解析为规范值的小型int
缓存。
由于问题 37986:提高 PyLong_FromDouble() 的性能,这将在 3.9 中发生变化,当double
小到足以无损地表示为 C long
时,现在将其委托给PyLong_FromLong
。 作为副作用,这将使用 small int
缓存,因为PyLong_FromLong
可靠地对小值进行标准化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.