不可变对象没有相同的id
个,事实上,这对于单独定义的任何类型的对象都不适用.一般来说,每次在Python中定义对象时,都会创建一个具有新标识的新对象.然而,为了优化(大多数情况下),对于小整数(介于-5和256之间)和具有特殊长度(通常小于20个字符)的内部字符串,也有一些例外情况,这些字符串是单例的,具有相同的id
个字符(实际上是一个具有多个指针的对象).您可以通过以下方式进行判断:
>>> 30 is (20 + 10)
True
>>> 300 is (200 + 100)
False
>>> 'aa' * 2 is 'a' * 4
True
>>> 'aa' * 20 is 'a' * 40
False
对于自定义对象:
>>> class A:
... pass
...
>>> A() is A() # Every time you create an instance you'll have a new instance with new identity
False
还请注意,is
运算符将判断对象的标识,而不是值.如果要判断该值,应使用==
:
>>> 300 == 3*100
True
由于元组或任何可变类型都没有这样的优化或实习规则,如果你定义两个大小相同的元组,它们将获得自己的身份,因此不同的对象:
>>> a = (1,)
>>> b = (1,)
>>>
>>> a is b
False
还值得一提的是,"单例整数"和"插入字符串"的规则是正确的,即使它们是在迭代器中定义的.
>>> a = (100, 700, 400)
>>>
>>> b = (100, 700, 400)
>>>
>>> a[0] is b[0]
True
>>> a[1] is b[1]
False