意外的id方法行为

问题描述 投票:3回答:2

简单来说,为什么此代码返回False而不是true:

a = 10
print(id(a) is id(a)) # why false?

id()返回整数,并且相同的整数vars指向相同的整数对象。那么为什么返回false?有什么区别:

a = 10
b = 10
print(a is b) # it returns True

感谢您的解释。

python low-level id
2个回答
1
投票

因为确实如此

a is a

[id(a)是一个大整数,无法与is进行比较

>>> a = 10
>>> print(id(a) is id(a))
False
>>> print(id(a),id(a))
(44337068, 44337068)
>>>

检查https://docs.python.org/2/c-api/int.html#c.PyInt_FromLong的整数是否与is进行比较-但请记住,这是实现的详细信息,因此请不要依赖它(始终将整数与==进行比较):

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

(来自"is" operator behaves unexpectedly with integers

为了获得始终使用==的动力,请执行以下操作:

a = 300
b = 300
print(a is b)
print(a is 300)
def c(a): return a is 300
def d(a): return a is b
print(c(a))
print(d(a))

保存到文件并运行时,打印TrueTrueFalseTrue ...


0
投票

例如,如果您尝试这样做

 print(str(id(id(a))) + " " + str(id(id(a))))
In [54]: print(str(id(id(a))) + " " + str(id(id(a))))
2460780951888 2460780951888

In [55]: print(str(id(id(a))) + " " + str(id(id(a))))
2460780951472 2460780951472

In [56]: print(str(id(id(a))) + " " + str(id(id(a))))
2460782062320 2460782062320

In [57]: print(str(id(id(a))) + " " + str(id(id(a))))
2460780951888 2460780951888

In [58]: print(str(id(id(a))) + " " + str(id(id(a))))
2460782473392 2460782475664

每次都会为大整数返回新的ID

正如@thebjorn提到的那样,python解释器不会缓存大整数,只有-5到256之间的整数(在CPython实现中)始终处于活动状态。

每次引用一个大整数时,都会为其创建一个新对象,而对于一个小整数,将继续使用同一对象(作为优化),但是不能保证在所有python实现中都将其保持为真。

© www.soinside.com 2019 - 2024. All rights reserved.