Python 为什么两个单独创建的不可变对象具有相同的id,而可变对象具有不同的id,而它们都引用相同的值?

Python 为什么两个单独创建的不可变对象具有相同的id,而可变对象具有不同的id,而它们都引用相同的值?,python,immutability,identifier,concept,mutability,Python,Immutability,Identifier,Concept,Mutability,两个单独创建的可变列表具有不同的ID pythonshell:(可变) 而两个单独创建的不可变字符串具有相似的ID pythonshell:(不可变) a和b引用的对象是否相同?如果没有,为什么ID是相似的? mylist和yourlist是否引用了不同的对象?如果是,为什么它们有不同的ID。Python缓存一些小字符串和数字: 当前实现为所有对象保留一个整数对象数组 介于-5和256之间的整数,当您在该范围内创建整数时 实际上,只需返回对现有对象的引用 而id(some_list)始终为您提供

两个单独创建的可变列表具有不同的ID

pythonshell:(可变)

而两个单独创建的不可变字符串具有相似的ID

pythonshell:(不可变)

a
b
引用的对象是否相同?如果没有,为什么ID是相似的?
mylist
yourlist
是否引用了不同的对象?如果是,为什么它们有不同的ID。

Python缓存一些小字符串和数字:

当前实现为所有对象保留一个整数对象数组 介于-5和256之间的整数,当您在该范围内创建整数时 实际上,只需返回对现有对象的引用


id(some_list)
始终为您提供内存中的容器列表对象的地址,而不是列表中的字符串

由于这个原因,可变对象可能会发生变化,列表会创建两次,但如果您检查两个列表的元素0的id,它们应该是相同的。由于列表是可变的,所以即使列表中的每个“单元”都指向相同的“不可变”对象,也不能期望列表指向相同的对象。由于这个原因,不可变对象不能变异,python可以对其进行优化并防止重复。有没有办法创建两个值在-5和256之间相同但作为不同对象的变量
a=2
b=2
,然后
a是b
将返回
True
。有没有一种方法可以让两个对象的值都为2,但对象不同?@JesseZhuang我只看到一种方法——通过int子类化。您自己的integer类的所有实例都将是不同的对象。。。
>>> mylist = ['spam', 'eggs']
>>> yourlist = ['spam', 'eggs']
>>> id(mylist), id(yourlist)
(49624456, 48910408)
>>> a = 10
>>> b = 10
>>> id(a), id(b)
(507099072, 507099072)