Python在Python shell和*.py文件中运行时会有不同的内存管理行为
例1:Python在Python shell和*.py文件中运行时会有不同的内存管理行为,python,python-2.7,Python,Python 2.7,例1: ➜ /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 Co
➜ /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 shell和*.py文件中运行大整数时的不同行为?如果我是读取.py文件的Python解释器(如第一个示例中所示),我只会为这个数字分配一次内存,然后使
a
和b
指向这个位置
例如,解释器读取这个文件,看到两个变量被分配了相同的值,就想:“我想通过为相同的值分配两个部分来浪费内存吗?不,我不想。相反,我最好分配一个块,并将这个值存储在其中。”。所以,这个值只有一个副本,这就是为什么这些变量有相同的id
在第二种情况下,Python在执行赋值时必须分配内存,因此有两块内存具有相同的数据
总而言之,在第一种情况下,解释器对代码了解得更多(给出了整个代码),因此它可以对代码进行优化(并生成
.pyo
文件),而在第二种情况下,它根本无法进行任何优化。实际上,CPython运行时确实“实习生”(缓存)了一些不可变的对象(整数不超过某个值,字符串可能是合法的python标识符等)作为优化。所有这些行为都完全依赖于实现,并且在任何情况下都不应该依赖,正如您刚才注意到的那样。谢谢,现在我知道此行为完全依赖于实现!