Python如何知道已经存储在其内存中的值?

Python如何知道已经存储在其内存中的值?,python,python-3.x,memory,Python,Python 3.x,Memory,我想知道Python如何知道(如果它知道的话)值类型对象已经存储在它的内存中(并且还知道它在哪里) 对于此代码,当为b分配值1时,它如何知道值1已在其内存中并将其引用存储在b中 >>> a = 1 >>> b = 1 >>> a is b True Python在你告诉它之前什么都不知道。因此,在上面的代码中,当您初始化a和b时,您将存储这些值(在寄存器或RAM中),并调用存储位置a和b,以便以后可以引用它们。如果您没有首先初始化变量,py

我想知道Python如何知道(如果它知道的话)值类型对象已经存储在它的内存中(并且还知道它在哪里)

对于此代码,当为
b
分配值
1
时,它如何知道值
1
已在其内存中并将其引用存储在
b

>>> a = 1
>>> b = 1
>>> a is b
True

Python在你告诉它之前什么都不知道。因此,在上面的代码中,当您初始化a和b时,您将存储这些值(在寄存器或RAM中),并调用存储位置a和b,以便以后可以引用它们。如果您没有首先初始化变量,python只会给您一个错误。

python(精确地说是CPython)使用共享的小整数来帮助快速访问。内存中已经存在范围为[-5256]的整数,因此如果检查地址,它们是相同的。然而,对于较大的整数,这不是真的

a = 100000
b = 100000
a is b # False
等等,什么?如果你查看这些号码的地址,你会发现一些有趣的事情:

a = 1
b = 1
id(a) # 4463034512
id(b) # 4463034512

a = 257
b = 257
id(a) # 4642585200
id(b) # 4642585712
它被称为整数缓存。您可以阅读有关整数缓存的更多信息

感谢@KlausD和@user2357112的评论,对小整数的直接访问将使用整数缓存,而如果您进行计算,尽管它们可能等于[-5256]范围内的数字,但它不是缓存的整数。e、 g

pow(3, 47159012670, 47159012671) is 1 # False
pow(3, 47159012670, 47159012671) == 1 # True
“当前实现为所有对象保留一个整数对象数组 介于-5和256之间的整数,当您在该范围内创建整数时 实际上,只需返回对现有对象的引用。”


为什么??因为小整数更常被循环使用。使用对现有对象的引用而不是创建新对象可以节省开销。

如果您查看一下,它为CPython实现了
int
类型,您将看到-5(
NSMALLNEGINTS
)和256(
NSMALLPOSINTS-1
)之间的数字是预先分配和缓存的。这样做是为了避免为最常用的整数分配多个不必要的对象。这是因为整数是不可变的:不需要多个引用来表示同一个数字。

如果两个变量引用的值在-5和256之间(与使用相反),则使用
print(hex(id(b))
检查
b
>>hex(id(b))'0x7ffe705ee350'的内存地址那么根据定义只有一个对象。@Yusufsn否。对于更大的整数(>256)它不是真的。正如我所说的,只有-5到256之间的值我认为你没有抓住问题的关键
a==b
显然是正确的。OP询问为什么
a是b
是真的。只是想说明一下:这对CPython解释器是有效的。Python语言没有定义这一点,其他解释器可以自由地拥有自己的实现。而且
10e5
是一个浮点,而不是一个int。(另外,并非所有小int都来自小int缓存。例如,在当前的CPython上,
pow(34715901267047159012671)==1
,但是
pow(347115901267047159012671)不是1(代码>)