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

问题描述 投票:10回答:3

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

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

>>> a = 1
>>> b = 1
>>> a is b
True
python python-3.x memory
3个回答
13
投票

Python(精确的CPython)使用共享的小整数来帮助快速访问。内存中存在[-5,256]的整数范围,因此如果检查地址,它们是相同的。但是,对于较大的整数,情况并非如此。

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

它被称为整数缓存。您可以阅读有关整数缓存here的更多信息。

感谢@KlausD和@ user2357112提到的注释,对小整数的直接访问将使用整数缓存,而如果你进行计算,虽然它们可能等于[-5,256]范围内的数字,但它不是缓存的整数。例如

pow(3, 47159012670, 47159012671) is 1 # False
pow(3, 47159012670, 47159012671) == 1 # True

“当前实现为-5到256之间的所有整数保留了一个整数对象数组,当你在该范围内创建一个int时,实际上只返回对现有对象的引用。”

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


5
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.