Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在Python shell和*.py文件中运行时会有不同的内存管理行为_Python_Python 2.7 - Fatal编程技术网

Python在Python shell和*.py文件中运行时会有不同的内存管理行为

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

例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 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标识符等)作为优化。所有这些行为都完全依赖于实现,并且在任何情况下都不应该依赖,正如您刚才注意到的那样。

谢谢,现在我知道此行为完全依赖于实现!