2015-09-09 116 views
0

Python如何爲文字分配內存地址?文字的內存地址

>>> id(1) 
4298171352 
>>> id(2) 
4298171328 
>>> id(1.0019) 
4299162496 
>>> id(1.0025) 
4299162496 
>>> id(1.00999) 
4299162496 
>>> a = 1.0025 
>>> b = 1.00999 
>>> id(a) 
4299162496 
>>> id(b) 
4299162472 
>>> 
[email protected] ~ $ python 
Python 2.7.10 |Anaconda 2.2.0 (x86_64)| (default, May 28 2015, 17:04:42) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
Anaconda is brought to you by Continuum Analytics. 
Please check out: http://continuum.io/thanks and https://binstar.org 
>>> id(1) 
4298171352 

它是如何,1.0025和1.0999對應於相同的存儲器位置,但是,當我設置a和b等於那些現在有不同的存儲位置的相應值?當我重新啓動Python時,它的內存地址是一樣的嗎?

此外,這是否意味着每個整數和分箱浮點數和字符都有一個預先存在的內存地址?

+2

由於您沒有在任何位置分配值,因此可以重新使用內存。 – Barmar

+0

Python緩存小整數(我現在不記得確切的範圍),並且由於緩存是在啓動時完成的,從一次運行到下一次運行它們具有相同的內存地址似乎是合理的 - 但是,沒有關於python內存分配器如何工作的專家(以及它如何與操作系統的內存分配器交互)。 – mgilson

+0

另請參閱:http://stackoverflow.com/q/306313/748858 – mgilson

回答

1

documentation:具有非重疊的壽命可以具有相同的值id()

兩個對象。

既然你不是在你的第一個測試分配1.00251.0999任何東西,只要它執行完,它打印id()語句中的每個值的生命週期結束。由於它們的生命週期不重疊,Python可以爲它們重用相同的內存,因此它們的值相同。

當您將它們分配給變量時,只要這些變量包含這些值,它們的生存期就會存在。因此,它們不能放在相同的內存中,並且返回不同的值。

+0

我認爲OP更重要的是重新啓動解釋器並獲得相同的編號 –

+0

我認爲他只是詢問爲什麼當他將其輸入交互式命令循環時,他獲得相同的ID。 – Barmar

+0

再看一遍,我想他/她都問。我無法每次重新啓動解釋器時使用python2.7.6重新生成相同的id,但使用python3.4我可以 –