Python 中的两个变量具有相同的 id
:
a = 10
b = 10
a is b
>>> True
如果我拿两个 list
s:
a = [1, 2, 3]
b = [1, 2, 3]
a is b
>>> False
根据 此链接,Senderle 回答说不可变对象引用具有相同的 ID,而可变对象(如列表)具有不同的 ID。
所以现在根据他的回答,元组应该有相同的 id——意思是:
a = (1, 2, 3)
b = (1, 2, 3)
a is b
>>> False
理想情况下,由于元组不可变,它应该返回 True
,但它正在返回 False
!
解释是什么?
原文由 Ram Vallury 发布,翻译遵循 CC BY-SA 4.0 许可协议
不可变对象不具有相同的
id
,事实上,对于您单独定义的任何类型的对象而言,情况并非如此。一般来说,每次在 Python 中定义一个对象时,都会创建一个具有新标识的新对象。然而,为了优化(大部分),小整数(-5 到 256 之间)和内部字符串有一些例外,具有特殊长度——通常少于 20 个字符——*它们是单例并且具有相同的id
(实际上是一个对象有多个指针)。您可以像下面这样检查:对于自定义对象:
另请注意,
is
运算符将检查对象的身份,而不是值。如果你想检查你应该使用的值==
:并且由于对于元组或任何可变类型没有这样的优化或实习规则,如果您定义任何大小的两个相同元组,它们将获得自己的身份,因此不同的对象:
还值得一提的是,即使在迭代器中定义了“单例整数”和“驻留字符串”的规则也是如此。
\* 关于此的一篇很好且详细的文章:http: //guilload.com/python-string-interning/