Python中的两个变量具有相同的id:

a = 10
b = 10
a is b
>>> True

如果我拿两个list:

a = [1, 2, 3]
b = [1, 2, 3]
a is b
>>> False

根据this link Senderle的回答,不可变对象引用具有相同的id,而列表等可变对象具有不同的id.

根据他的回答,元组应该有相同的ID,意思是:

a = (1, 2, 3)
b = (1, 2, 3)
a is b
>>> False

理想情况下,由于元组是不可变的,它应该返回True,但它返回False

原因是什么?

推荐答案

不可变对象没有相同的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

Python-3.x相关问答推荐

Django内置注销视图`不允许的方法(GET):/USERS/LOGOUT/`

从.csv导入将文件夹路径加入到文件名

我不能使用拆分来分隔数据

没有这样的命令';角色';-可靠分子

逐行比较2个Pandas数据帧,并对每一行执行计算

Python-Django 设置 Pandas DataFrame 的多索引不会分组/合并最后一个索引

Django在POST到外部URL时如何进行CSRF保护? 更新

类不继承时 super() 的用途

在 python pandas 中设置条件和分配新值

通过点和线计算CV2 Homography

使用 python-binance 时,heroku [regex._regex_core.error: bad escape \d at position 7] 出错

在初始化之前禁用`__setattr__`的干净方法

pip install mysqlclient 失败为 mysqlclient 运行 setup.py bdist_wheel ... 错误

为什么Pandas会在 NaN 上合并?

在 Python 3 中获取所有超类

如何将 cv2.imread 匹配到 keras image.img_load 输出

根据条件过滤元组列表

为什么 string.maketrans 在 Python 3.1 中不起作用?

在 Alembic 迁移期间更新列内容

map 对象不是 JSON 可序列化的