
[英]How does Python know there is a local variable before encountering its declaration?
[英]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.