为什么float('Inf')浮点('Inf')在Python中返回false?

时间:2016-05-12 14:58:47

标签: python infinity

在阅读有关Python的无限性的同时,我遇到了这个问题:

>>>float('Inf') == float('Inf')
True
>>>float('Inf') is float('Inf')
False
>>>float('Inf') is not float('Inf')
True

我理解等于有效,但我想知道float('Inf')实际指向哪个is测试返回False?每次拨打float('Inf')时都不一样吗?

编辑:我不是在询问==is 之间的区别。我问的是float('Inf')的实现细节以及这个对象的性质。

4 个答案:

答案 0 :(得分:2)

python中的

is==完全不同。 is检查身份,==检查身份,而其他一些用户已经说过here:Is there a difference between == and is in Python?

float()创建(或可能创建,取决于您的解释器)一个新对象,该对象与具有相同参数的float()创建的另一个对象不同(但相等)。

  

Cpython可能会为您的支票返回True,但其他虚拟机或   口译员可能不像Microsoft

所述

所以:

 >>> float(2) is float(2)
 >>> False
 >>> float(2) == float(2)
 >>> True

事实上,使用id()

可以将他们的身份视为完全不同
 >>> id(float(2))
 >>> 251452
 >>> id(float(2)) # same call
 >>> 251934       # different result

所以你应该只使用is,如果你真的,真的想要测试身份而不是价值。

答案 1 :(得分:0)

简单地说,is适用于objects并且只有当2个变量指向同一个对象时才会返回TRUE,而==适用于value所以, ,它说False的原因是因为调用了一个新浮点数

答案 2 :(得分:0)

当您说float('Inf')时,您正在创建一个新对象,该对象将存储在某个内存中,并具有对该内存位置的引用。当你这样做

>>>float('Inf') == float('Inf')

您正在创建两个这样的对象,每个对象具有相同的值,但位于两个不同的内存位置。这里的比较将比较这两个存储位置中的两个值,当然它会成真。

当你这样做时

>>>float('Inf') is float('Inf')

再次创建两个具有相同值的新对象,但位于不同的位置。但是现在你想要比较对内存位置的引用,当然那些不一样。

如果你考虑

的概念,这可能会更清楚
>>>a = float('Inf')
>>>b = float('Inf')
>>>a == b
True
>>>a is b
False

希望,一旦您认为ab是您正在创建的实际对象(而不是像示例中那样创建没有名称的对象),就会更清楚地发生了什么。< / p>

答案 3 :(得分:0)

而且你不需要调用float()或者&#39; Inf&#39;看到这个:

a = 1. 
b = 1. 
a == b 
True 
a is b 
False

添加仅作为答案,因为我无法将格式设置为对@Nishant响应的评论。