2016-04-14 13 views
3

例1:的Python不同的内存管理行为和* .py文件

➜ /tmp cat t.py 
a = 250000000000 
b = 250000000000 
print id(a), id(b), id(a) == id(b) 
➜ /tmp python t.py 
140450848587992 140450848587992 True #(Why is True?) 

例2:

➜ /tmp python 
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 250000000000 
>>> b = 250000000000 
>>> print id(a), id(b), id(a) == id(b) 
140443481339400 140443481339208 False #(I think it should be False) 

我知道Python有一个小整数缓存池(从 - 5到256),所以两个大整数应该有不同的id。

在Python壳* .py文件运行时,如何解释大整数的不同的行为?

回答

3

如果我是Python解释器读取.py文件(如您的第一个示例中),我只会为该编号分配一次内存,然后使ab指向此位置。

例如,解释器读取这个文件,看到两个变量被分配了相同的值,并且认为:“我是否想通过为相同的值分配两个部分来浪费内存?不,我不这样做,我最好分配一个块并存储这个值“。所以,只有一个该值的副本,这就是为什么这些变量具有相同的ID。

在第二种情况下,Python 分配内存,因此在执行分配时,所以有两块内存具有相同的数据。

综上所述,在解释器中有更多的了解的代码(整个代码中给出)第一种情况,因此它可以优化它(和生成.pyo文件),而在第二个也根本”不做任何优化。

2

其实CPython的运行时间确实“实习生”(高速缓存)一些不可改变的对象(整数达到一定值时,字符串可能是合法的Python标识符等)作为优化。所有这些行为都是完全依赖于实现的,并且不应该依赖于,正如你刚刚注意到的那样。

+0

谢谢,现在我知道这个行为完全依赖于实现! – virusdefender