为什么从字符串转换而来的python float与具有相同值的普通float不一样?

时间:2018-06-21 08:53:52

标签: python

我使用的是Python 3.6.5,但遇到了一个奇怪的现象:float('50.0')float(50.0)是不同的,尽管它们 彼此相等。

我运行了一些代码来找出差异。除了python说它们不一样外,我找不到区别。我很困惑。如果有人可以解释这里发生的事情,我会很喜欢。

这是我的测试:

if float('50.0') is float(50.0):
    print("float('50.0') is float(50.0)")
else:
    print("float('50.0') is not float(50.0)")

if float('50.0') == float(50.0):
    print("float('50.0') == float(50.0)")
else:
    print("float('50.0') != float(50.0)")

if float('50.0') is 50.0:
    print("float('50.0') is 50.0")
else:
    print("float('50.0') is not 50.0")

if float(50.0) is 50.0:
    print('float(50.0) is 50.0')
else:
    print('float(50.0) is not 50.0')

if float(50.0) is float(50.0):
    print('float(50.0) is float(50.0)')
else:
    print('float(50.0) is not float(50.0)')

xstr_float = float('50.0')
norm_float = float(50.0)
print ('xstr_float: {0:.100f}'.format(xstr_float))
print ('xstr_float is of type:{}'.format(type(xstr_float)))
print ('norm_float: {0:.100f}'.format(norm_float))
print ('norm_float is of type:{}'.format(type(norm_float)))

和我的结果:

float('50.0') is not float(50.0)
float('50.0') == float(50.0)
float('50.0') is not 50.0
float(50.0) is 50.0
float(50.0) is float(50.0)
xstr_float: 50.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
xstr_float is of type:<class 'float'>
norm_float: 50.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
norm_float is of type:<class 'float'>

基于评论中的一些讨论,我尝试了以下操作,但得到的结果无法回答问题:

x = float(50.0)
y = float(50.0)
if x is y:
    print('x is y')
else:
    print('x is not y')

x=12345
y=12345
if x is y:
    print('x is y')
else:
    print('x is not y')

导致:

x is y
x is y

更新:我标记了一个正确的答案,并基于对该答案的评论,向其他可能困惑我所缺少的人展示

当python创建对象时,会为其分配一个ID。比较两个对象返回相同的ID时,is返回true。有时python将缓存并重用对象。因此,在x is y的情况下,由于ID相同,因此可以看到已给定并重用了一个对象。我们还看到ID在python会话之间发生了变化:

x=12345
y=12345
if x is y:
    print('x is y')
else:
    print('x is not y')
print('x_id: {}'.format(id(x)))
print('y_id: {}'.format(id(y)))

产生

x is y
x_id: 2476500365040
y_id: 2476500365040

,并在下次运行时显示

x is y
x_id: 2234418638576
y_id: 2234418638576

如果由于某种原因无法重复使用同一对象来表示x和y,那么x is y将返回false。

1 个答案:

答案 0 :(得分:5)

我认为您一开始可能也会感到困惑。 is==不同。

如果两个变量指向同一对象,

is将返回True

如果变量指向相等的对象,

==将返回True

这个问题帮助我理解了这个问题: Is there a difference between == and is in Python?