簡體   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