在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)
答案 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'
>>>
正如您在此处看到的,当a
和b
为1
时,变量的存储位置与python运行时缓存的相同。由于c
和d
的数据类型是浮动的,因此它们在不同的存储位置被引用。当我们为a
和b
取较大的值时,它们的存储位置是不同的。
python中的is
语句不是比较运算符,但会告诉所引用的变量是否绑定到相同的对象。
根据here:
当前实现为所有对象保留一个整数对象数组 在-5到256之间的整数,当您在该范围内创建int时, 实际上只是获取对现有对象的引用。所以 应该可以更改1的值。我怀疑该行为 在这种情况下,Python的定义是不确定的。 :-)
答案 1 :(得分:0)
因为Python运行时会缓存一些小整数,以便可以重用它们。其他数字不会被缓存,并且每次创建对象时都需要分配对象。 is
测试两个对象是否是同一个对象,而不仅仅是两个具有相同数值的对象。
您不应依靠这种优化。始终使用==
测试数值相等性。