为什么 float('Inf') 在 Python 中是 float('Inf') returns false?

Why does float('Inf') is float('Inf') returns false in Python?

在阅读 Python 的无穷大时,我偶然发现了这个:

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

我知道 equals 有效,但我想知道 float('Inf') 实际上指向什么使得 is 测试 return False ?每次调用 float('Inf') 都不一样吗?

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

简而言之,is 作用于 objects,只有当 2 个变量指向同一个对象时 return 才为 TRUE,而 == 作用于 value 所以,它说 False 的原因是因为调用了一个新的浮点数

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

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

您正在创建两个这样的对象,每个对象都具有相同的值,但位于两个不同的内存位置。这里的比较会比较这两个内存位置的两个值,结果当然是true。

当你这样做时

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

您再次创建了两个具有相同值但位于不同位置的新对象。但是现在您正在尝试比较对内存位置的引用,当然这些引用不会相同。

如果你考虑

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

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

is和python中的==是完全不同的。 is 检查身份,而 == 检查是否相等,正如一些其他用户已经指出的那样 here:Is there a difference between == and is in Python?

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

Cpython may return a True for your check, but other VMs or interpreters may not as described by 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 如果你真的 真的 想要测试身份而不是价值。

而且您无需调用 float() 或 'Inf' 即可看到:

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

添加为答案只是因为我无法让格式正常工作作为对@Nishant 回复的评论。