前戏部分
# python中定义一个变量,如:`name = 'the3times'`,在计算机底层会发生这样一件事:操作系统调用硬件,在内存中开辟一块空间,将值'the3times'存放在这块内存空间中;然后将变量名name与这块内存空间的地址绑定关联在一起;程序通过变量名name的调用来唯一访问值'the3times'。
# 这样的话,如果程序中有许多变量需要定义就会在内存中开辟大量的内存空间;
# 另外,我们知道内存是有限的,变量数量如果太多就会造成内存不足甚至内存溢出的风险。
# 从这个角度出发,程序开发必须时刻且谨慎注意内存管理问题。然而内存管理这件事是繁琐且存在分险的。
栈区 & 堆区
我们知道变量的定义会把变量值存储在内存中。其实,具体的是把变量值存放在内存的堆区中,把变量名和变量值的绑定关系存放在栈区。绑定关系就是变量名保存变量值所在的内存地址。
通过访问变量名,找到其对应存储的变量值的内存地址,进而访问到变量值。
x = 10
y = 20
引用小猿取经的图片
直接引用 & 间接应用
通过栈区的变量名直接找到堆区的变量值,这种引用(访问)就是直接引用。
通过从栈区出发引用到堆区后,再进一步引用才能找到变量值的内存地址,这种是间接引用。
l2 = [20, 30] # 列表本身被变量名l2直接引用,包含的元素被列表间接引用
x = 10 # 值10被变量名x直接引用
l1 = [x, l2] # 列表本身被变量名l1直接引用,包含的元素被列表间接引用
引用小猿取经的图片
垃圾回收机制
幸运的是,python解释器帮我们做了这件事。python解释器自带的内存管理:垃圾回收机制。垃圾回收机制用来回收内存中不再使用的变量值所占用的内存空间。