【发布时间】:2018-11-30 12:56:43
【问题描述】:
我在 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'>
根据 cmets 中的一些讨论,我尝试了以下方法,得到的结果无法回答问题:
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。 is 在比较两个对象返回相同 ID 时返回 true。有时python会缓存和重用一个对象。所以在x is y的情况下,我们可以看到一个对象被给定并被重用,因为ID是相同的。我们还看到 python 会话之间的 ID 发生了变化:
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。
【问题讨论】:
-
不要与
is比较值,使用==。 -
@DanielRoseman 很明显他在比较价值和身份,这就是为什么同时使用
is和==的原因 -
但是为什么他会期望不同的对象有相同的身份呢?
-
观察:
x=12345; y=12345; (x is y) == False这与浮动的制作方式无关。 -
所以为了清楚地说明这一点,您了解
==和is之间的区别,并且您在问为什么CPython 有时会重复使用相同的浮点实例而有时不会?
标签: python