布尔输出不一致

时间:2019-07-10 04:19:31

标签: python-3.x

在Python中,如果

//activityItems is the base64 string
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];

返回True。

但是,如果

a = 1
b = 1
print(a is b) 

返回False。

对于浮点数据类型,输出为False。有人可以向我解释python为什么如此行事吗?

c = 1.23
d = 1.23

print(c is d) 

2 个答案:

答案 0 :(得分:2)

看看这个:

>>> a = 1
>>> b = 1
>>> print(a is b)
True
>>> c = 1.2
>>> d = 1.2
>>> print(c is d)
False
>>> hex(id(a))
'0x77fb6c20'
>>> hex(id(b))
'0x77fb6c20'
>>> hex(id(c))
'0x2185c8e1990'
>>> hex(id(d))
'0x2185c8e1a38'
>>> a = 900
>>> b = 900
>>> print(a is b)
False
>>> hex(id(a))
'0x2185d434e10'
>>> hex(id(b))
'0x2185d434eb0'
>>> 

正如您在此处看到的,当ab1时,变量的存储位置与python运行时缓存的相同。由于cd的数据类型是浮动的,因此它们在不同的存储位置被引用。当我们为ab取较大的值时,它们的存储位置是不同的。 python中的is语句不是比较运算符,但会告诉所引用的变量是否绑定到相同的对象。

根据here

  

当前实现为所有对象保留一个整数对象数组   在-5到256之间的整数,当您在该范围内创建int时,   实际上只是获取对现有对象的引用。所以   应该可以更改1的值。我怀疑该行为   在这种情况下,Python的定义是不确定的。 :-)

答案 1 :(得分:0)

因为Python运行时会缓存一些小整数,以便可以重用它们。其他数字不会被缓存,并且每次创建对象时都需要分配对象。 is测试两个对象是否是同一个对象,而不仅仅是两个具有相同数值的对象。

您不应依靠这种优化。始终使用==测试数值相等性。