来源:python中国网 时间:2019-06-06

  通过本站计算机底层基础我们知道当用键盘写字的时候实际上是用键盘上的电路在内存传递电压信号,这些信号在编程时可以被我们成为变量。所谓垃圾回收就是你定义了变量然不用之后就把他擦掉。高级语言都有自动垃圾回收机制,在C和C++中要人为回收垃圾!今天介绍python垃圾回收机制中的小整数对象池、大整数对象池和intern机制。

  Python同时使用2套垃圾回收机制:引用计数(这个变量被谁在用)和处理循环引用的GC

  1.小整数对象池

  整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。Python对小整数的定义是[-5,257)这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的,但是当定义2个相同的字符串时,引用计数为0,触发垃圾回收。

# -*- coding: utf-8 -*-
a = 1
b = 1
print(id(a),id(b))
c = "a"
d = "a"
print(id(c),id(d))

D:python3installpython.exe D:/python/py3script/python66_2.py
1794468896 1794468896
2128845012640 2128845012640

Process finished with exit code 0


  2.大整数对象池

  每一个大整数,均创建一个新的对象。

# -*- coding: utf-8 -*-
a = 10000
b = 10000
print(id(a),id(b))  #理论上不应该一样

D:python3installpython.exe D:/python/py3script/python66_2.py
2487047187280 2487047187280

Process finished with exit code 0



  3.intern机制

a1 = "HelloWorld"
a2 = "HelloWorld"
a3 = "HelloWorld"
a4 = "HelloWorld"
a5 = "HelloWorld"
a6 = "HelloWorld"
a7 = "HelloWorld"
a8 = "HelloWorld"
a9 = "HelloWorld"
python会不会创建9个对象呢?在内存中会不会开辟9个”HelloWorld”的内存空间呢? 想一下,如果是这样的话,我们写10000个对象,比如a1=”HelloWorld”…..a1000=”HelloWorld”, 那他岂不是开辟了1000个”HelloWorld”所占的内存空间了呢?如果真这样,内存不就爆了吗?所以python中有这样一个机制——intern机制,让他只占用一个”HelloWorld”所占的内存空间。靠引用计数去维护何时释放。


  总结:

  小整数[-5,257)共用对象,常驻内存

  单个字符共用对象,常驻内存

  单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁单词垃圾回收

  字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为0,销毁

  大整数不共用内存,引用计数为0,销毁大整数垃圾回收

  数值类型和字符串类型在Python中都是不可变的,这意味着你无法修改这个对象的值,每次对变量的修改,实际上是创建一个新的对象