为什么 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
希望,一旦您认为 a
和 b
是您正在创建的实际对象(而不是像您的示例中那样创建没有名称的对象),就会更清楚发生了什么.
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 回复的评论。
在阅读 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
希望,一旦您认为 a
和 b
是您正在创建的实际对象(而不是像您的示例中那样创建没有名称的对象),就会更清楚发生了什么.
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 回复的评论。