在阅读有关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')
的实现细节以及这个对象的性质。
答案 0 :(得分:2)
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
希望,一旦您认为a
和b
是您正在创建的实际对象(而不是像示例中那样创建没有名称的对象),就会更清楚地发生了什么。< / p>
答案 3 :(得分:0)
而且你不需要调用float()或者&#39; Inf&#39;看到这个:
a = 1.
b = 1.
a == b
True
a is b
False
添加仅作为答案,因为我无法将格式设置为对@Nishant响应的评论。