【发布时间】:2022-11-25 00:54:46
【问题描述】:
例如我们有这段代码。
x = 1
y = 1
print(x is y) # TRUE
print(id(x), id(y))
y = pow(10, 30, 10**30-1) # 1
print(type(y))
print(x, y, x is y) # FALSE
它的回报:
True
140516304938720 140516304938720
<class 'int'>
1 1 False
最后的结果是错误的.请帮我理解为什么会这样?函数的结果是 1,不是字面意思,python 中的哪个缓存?
如果我们改成
y = pow(1, 10)
它将返回“真”。
【问题讨论】:
-
如文档 (docs.python.org/3.8/reference/expressions.html#comparisons) 中所述,
is比较对象标识。==比较对象是否相等。具有相同值的两个对象是相等的,但它们具有不同的id(object)。小整数不是动态分配的,它们是从预分配对象池中获取的。这就是为什么小的相等整数总是相同的。这是一个可能随时更改的实施细节。 -
要点:如果要测试是否相等,请不要使用
is。这就是==的用途。 -
马蒂亚斯说的。在两种情况下使用
is:针对 None 进行测试,如if value is None或检查“相同对象”而不是“相等对象”,这种情况很少见但会发生。如果您知道像 C 这样的编译语言,这就像比较一个值的地址而不是值本身。 -
重新分配后尝试打印出
id(y)
标签: python function syntax operators literals