"is" 和 "id" 在 Python 3.5
"is" and "id" in Python 3.5
我有问题:
我使用的是 python 3.5 , win7-32bit 系统.
这是我的代码:
a=3
b=3
print(id(a))
print(id(b))
它returns:
1678268160
1678268160
所以我们可以知道 a 和 b 引用同一个对象。
但是问题来了:
a=3
b=3
print( id(a) is id(b) )
它return :
False
我不明白为什么会这样,我想这应该是真的。
谁能给我解释一下?
谢谢!
id(a) is id(b)
比较id
函数返回的id的id.
id(a) == id(b)
将是 True
,因为 a is b
并且在对象的生命周期中,id
返回的值将始终相同。但是,每次调用 id
时,都会返回一个不同的整数(具有相同的值),因此 id(a) is id(b)
是 False
。
id
returns 一个 Python int
对象(你正在 id
-ing 的对象的内存地址,尽管这是一个实现细节).但是除了非常小的 int
s(同样是实现细节),Python 中没有 int
缓存;如果您以两种方式计算相同的 int
,则两个不同的 int
对象恰好具有相同的值。同样,每次调用 id
都会创建一个新的 int
,即使对象是相同的。
id
和 is
的等价性是 a is b
意味着 id(a) == id(b)
,而不是 id(a) is id(b)
(事实上,因为 id
s 是大数,id(a) is id(b)
几乎总是 False
).
另请注意,您的测试用例在其他方面存在缺陷:
a = 3
b = 3
a is b
只有 returns True
用于 is
比较,因为 CPython 中的小 int
缓存;如果你完成了:
a = 1000
b = 1000
a is b
a is b
将是 False
;您关于身份的假设仅在 CPython 中适用于 -5 到 256 范围内的数字,出于性能原因,它们是单例,但所有其他 int
s 都是根据需要重新创建的,而不是单例。
我有问题: 我使用的是 python 3.5 , win7-32bit 系统.
这是我的代码:
a=3
b=3
print(id(a))
print(id(b))
它returns:
1678268160
1678268160
所以我们可以知道 a 和 b 引用同一个对象。
但是问题来了:
a=3
b=3
print( id(a) is id(b) )
它return :
False
我不明白为什么会这样,我想这应该是真的。 谁能给我解释一下? 谢谢!
id(a) is id(b)
比较id
函数返回的id的id.
id(a) == id(b)
将是 True
,因为 a is b
并且在对象的生命周期中,id
返回的值将始终相同。但是,每次调用 id
时,都会返回一个不同的整数(具有相同的值),因此 id(a) is id(b)
是 False
。
id
returns 一个 Python int
对象(你正在 id
-ing 的对象的内存地址,尽管这是一个实现细节).但是除了非常小的 int
s(同样是实现细节),Python 中没有 int
缓存;如果您以两种方式计算相同的 int
,则两个不同的 int
对象恰好具有相同的值。同样,每次调用 id
都会创建一个新的 int
,即使对象是相同的。
id
和 is
的等价性是 a is b
意味着 id(a) == id(b)
,而不是 id(a) is id(b)
(事实上,因为 id
s 是大数,id(a) is id(b)
几乎总是 False
).
另请注意,您的测试用例在其他方面存在缺陷:
a = 3
b = 3
a is b
只有 returns True
用于 is
比较,因为 CPython 中的小 int
缓存;如果你完成了:
a = 1000
b = 1000
a is b
a is b
将是 False
;您关于身份的假设仅在 CPython 中适用于 -5 到 256 范围内的数字,出于性能原因,它们是单例,但所有其他 int
s 都是根据需要重新创建的,而不是单例。