2016-05-12 173 views
0

虽然读了Python的无穷大,我来到这个防空火炮:为什么float('Inf')是float('Inf')在Python中返回false?

>>>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')的实现细节以及此对象的性质。

+5

可能重复[在Python中\'== \'和\'is \'有区别吗?](http://stackoverflow.com/questions/132988/is-there-a-difference-between python) – GingerPlusPlus

+0

这是因为'is'比较了两个对象的内存地址,而'=='比较了这些对象本身。 ||如上所述,通过'is'进行比较时,实际上会在内存中创建两个具有相同结构的不同对象。两个对象具有相同的结构,但它们并不相同,因为地址不同。认为它像宇宙。 –

+0

是的,我明白,但是它指向什么地址? –

回答

2

is==在Python中有很大的不同。 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

'float()'*可能*创建一个新的对象;一个有进取心的口译员可能会记住或预先分配预期会被普遍使用的某些值。 – chepner

+0

@chepner通过做类似'1000的事情可以很容易地在Python中看到1000是1000',并且看到它是真的。然而,说'x = 1000'并且'x是1000'是不正确的,因为你刚刚表示。 – zephyr

+0

@chepner我刚刚在一个编辑中表示。谢谢 –

0

简而言之,is作品上objects,并只返回TRUE,如果,如果两个变量都指向同一个对象,而==作品上value因此,,它说False的原因是因为一个新的浮动的叫了起来

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是你创建(而不是一个没有名字创建为实际的对象,这可能是更清楚你的例子),更清楚发生了什么。

+0

说“对象”而不是“变量”。声明“Python没有变量”有一些事实。它具有指向对象的名称。 – chepner

+0

这听起来像我的语义。如果你的意思是变量是一个基本的数据类型,那么是的,python没有变量。但是我在一般意义上使用变量来表示一个引用某个事物的名称。在python中,东西总是一个对象,但名称仍然是一个变量。 – zephyr

+1

'变量'表示可变性,但在Python中,您可以更改名称引用的对象,并且可以对某些对象进行变异,避免单词变量有时会避免混淆。 – RemcoGerlich

0

而你并不需要调用浮动()或“天道酬勤”看到这样的:

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

添加作为回答,只是因为我不能格式化为一个注释@Nishant正常工作响应。