基础知识
容器
哪些是容器对象:列表、数组、字典、元组、类和实例等
栈区和堆区
1、我们在定义变量的时候,变量名和变量值都是需要存储的,分别对应内存中的两块区域:栈区和堆区。
2、栈区:存放变量名与值内存地址的关联关系
3、堆区: 存放变量值。内存管理回收的就是堆区的内容。
例如:定义了两个变量x=10, y=20,具体解释如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BueiUsla-1640616720544)(Python的垃圾回收与内存泄露_files/74577840.png)]
当我们执行x=y时,内存中的栈区与堆区变化如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbgEsesK-1640616720546)(Python的垃圾回收与内存泄露_files/74637541.png)]
直接引用和间接引用
1、直接引用:从栈区出发直接引用到内存地址。
2、间接引用:从栈区出发引用到堆区后,再通过进一步引用才能到达内存地址。
间接引用值存在与容器中,例如:列表、字典、元组等。容器的变量名存储着整个容器的内存地址,容器中又存储的是每个元素的内存地址。
3、直接引用的例子:
x = 10
y = “刘翔”
z = [1, "good"]
4、间接引用的例子:
list_1 = [1, 2] # 列表本身被变量名list_1直接引用,包含的元素被列表间接引用
x = 10 # 值10被变量名x直接引用
list_2 = [x, list1] # 列表本身被list_2直接引用,包含的元素被列表间接引用
5、解释图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLtrnPIw-1640616720547)(Python的垃圾回收与内存泄露_files/75386194.png)]
6、容易犯错的地方:
x = 10
y = ["good", x]
x = 20
print(x)
print(y)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RQwTBcR-1640616720548)(Python的垃圾回收与内存泄露_files/75655565.png)]
循环引用
1、定义:两个对象之间分别相互引用对方。
2、引发的问题:当出现对象(变量值)不再被任何变量名所引用(那就得回收)时,由于它的引用计数不会为0,所以会导致该对象永远(变量值/内存)不会被回收。这样最终的结果会导致内存泄露!
2