繁体   English   中英

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

[英]How does Python know the values already stored in its memory?

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM