2015-09-09 72 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我可以 –