print id(float('inf')), id(float('-inf'))
print type(float('inf')), type(float('-inf'))
print float('inf') == float('-inf')
输出
35997760 35997760
<type 'float'> <type 'float'>
False
id相同,为何值却不同?原理是什么?
print id(float('inf')), id(float('-inf'))
print type(float('inf')), type(float('-inf'))
print float('inf') == float('-inf')
输出
35997760 35997760
<type 'float'> <type 'float'>
False
id相同,为何值却不同?原理是什么?
4 回答4.5k 阅读✓ 已解决
1 回答3.3k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
Python的文档在
id()
中有这样一句话:里面说,两个生存期不重叠的对象有可能有相同的
id()
值,正如你在C里面malloc()
之后立刻free()
,然后又分配,两次的内存极有可能是相同的。在你的print id(float('inf')), id(float('-inf'))
中生存期并没有重叠,因为在id()
返回了它的id之后float('inf')
就因为不再被引用而被释放了,生存期结束;而后下一个float('-inf')
就被Python分配了相同的id。这里要补充,这里id是否相同是实现相关的,也就是说,可能CPython会相同,而JPython未必,IronPython也未必。当然了,等号在判断
float
是否相等的时候,是不关心它的id,只关心它的值。==
在关心id的情况,只有在比较类的实例的时候,int, float, str, list, dict
依然是判断值:然而整数又是不同的状况,这时为什么呢?这时因为Python有一个
small_int
缓存(有多小呢,CPython 2.7的实现是规定在[-5, 256]
),它将小整数缓存起来,每次引用到这个整数就从缓存里拿对象,从而避免频繁内存分配,于是就造成了这个著名的情况: