Python内存管理机制详解:垃圾收集、引用计数与内存池
创始人
2024-12-18 08:40:33
0 次浏览
0 评论
为什么说python采用的是基于值的内存管理模式
让我们从浅层次开始。Python的内存管理机制可以从三个方面来看:(1)垃圾收集(2)引用计数(3)内存池机制1.垃圾收集:Python不像C++、Java等语言。
同样,他们可以直接给变量赋值,而无需事先声明变量类型。
对于Python语言来说,对象的类型和内存是在运行时确定的。
这就是为什么我们把Python语言称为动态类型(这里我们可以把动态类型归结为变量内存地址的分配,在运行时自动判断变量类型并给变量赋值。
是)。
2.引用计数:Python使用类似于Windows内核对象的方法来管理内存。
每个对象都维护指向该对象的引用计数。
如图(图片来自Python核心编程)x=3.14y=x我们首先创建一个对象3.14,然后将这个浮点数对象的引用赋值给x,因为x是第一个引用,所以,这个浮点数点号对象引用计数为1。
语句y=x创建一个指向同一对象的引用别名y。
我们发现并没有为Y创建一个新的对象,但是Y也指向了x所指向的浮点对象。
制作参考编号为2。
我们可以很容易地证明上面的观点:变量A和变量B的ID是一致的(我们可以把ID值想象成指向C中变量的指针)。
为了澄清问题我们引用另一个网站的图片:C语言例如,当我们创建一个变量A时,会为该变量分配一块内存空间,并将变量值放置在该空间中,当该变量被赋值给另一个变量B时,将为B分配一块新的内存空间,变量值必须放在B的内存空间中,这就是为什么A和B的指针不一致。
如图:Python中情况有所不同。
其实Python的处理方式有点类似于JavaScript,变量就像是附加在对象上的标签(类似于引用的定义)。
当变量绑定到对象时,该变量的引用计数为1(还有其他情况会导致变量引用计数递增)。
系统会自动维护这些标签并定期扫描,一旦参考号变为0,该对就会被回收。
3.内存池机制Python的内存机制是基于金字塔行的。
-1和-2层主要由操作系统驱动。
第0层由C及其他层中的malloc、free等内存分配和释放函数驱动。
第二层是内存池,由Python接口函数PyMem_Malloc函数实现,当对象小于256K时,该层。
直接分配内存,第三层是最顶层,也就是我们Python直接操作对象;如果重复调用malloc和free,就会出现性能问题。
另外,小块内存的重复分配和释放会导致内存碎片:如果请求的内存分配在1到256字节之间,你的使用自己的内存管理系统,否则直接使用malloc。
这里仍然会调用malloc来分配内存,但是每次都会分配一个大小为256的块。
k大内存块。
通过内存池注册的内存最终会被回收到内存池中,不会通过调用C的free来释放以供下次使用,比如值、字符串、元组(the)。
元组不允许改变)采用的是复制方式(深复制?)。
也就是说,当变量A被赋值给另一个变量B时,虽然A和B的内存空间仍然是相同的。
A的值发生变化时,A又会被赋予空值,此时A和B的地址不再相同;而对于字典、列表等,改变一个就会改变另一个,也称为浅拷贝:附录:引用计数增加1。
创建的对象:x=42。
创建另一个:y=x3。
作为参数传递给函数:foo(x)4作为容器对象的元素:a=[1,x,'33']引用计数减1。
本地引用离开了它的范围。
例如,当上面的foo(x)函数终止时,已删除的对象引用将从窗口对象中删除:myList.remove(x)5窗口对象本身被销毁:delmyList.remove(x)5对象本身已离开范围。
垃圾收集1.当有部分内存不再使用时,垃圾收集器会将它们清理掉。
它检查引用计数为0的对象并清除其内存空间。
当然除了清除引用计数0之外,1
python打印金字塔
"""defprintGoldTa(input):L=[chr(i)forriinrange(65,91)]##大写字母A--ZidA=65#从A开始idInput=ord(input)num=idInput-idA+1##A--输入的字符数print"A-->"+input+Cao+str(num)tempResult=""forCinrange(0,num):##left[ABCD]forC1inrangee(0,C):tempResult=tempResult+L[C1]##中[E]tempResult=tempResult+L[C]##right[DCBA]forC2inrange(C-1,-1,-1):tempResult=tempResult+L[C2]##C3inrange(num-1-C):#tempResult=""+tempResult##Print每行的空格tempResult输出##删除临时结果tempResult=""#endfor#enddefprintGoldTa("E")printGoldTa("H")##################A-->E:5AABAABCBAABCDCBAABCDEDCBAA-->H:8AAABAABCBAABCDCBAABCDEDCBAABCDEFEDCBAABCDEFGFEDCBAABCDEFGHGFEDCBA
相关文章
全面解析:Python六大核心数据类型及...
2024-12-18 03:04:52Python文件存在性检查与字符串类型判...
2024-12-22 15:04:09Python编程:为何成为少儿编程启蒙首...
2024-12-15 14:24:36Python打印输出格式详解:使用方法及...
2024-12-15 05:37:45Python数组下标获取值详解及代码示例
2024-12-16 23:17:46Python编程基础:实用代码示例与技巧...
2024-12-15 05:32:40Python字符串处理与打印技巧详解
2024-12-15 05:48:22Python学习指南:优势、局限与选择
2024-12-16 01:22:25Python编程技巧:实现数字列表的循环...
2024-12-15 12:48:32Python培训实战解析:昌平北大青鸟学...
2024-12-17 12:00:27最新文章
23
2024-12
23
2024-12
23
2024-12
23
2024-12
23
2024-12
23
2024-12
22
2024-12
22
2024-12
22
2024-12
22
2024-12
热门文章
1
Python编程入门:全面解析Pytho...
python的基本语法基本的Python语法如下:1.变量的定义。在编程语言中,...
2
Python字典操作全解析:添加、修改、...
Pythondict字典基本操作(包括添加、修改、删除键...
3
Python错误处理与异常处理:构建稳定...
2.5错误处理与异常在编程领域,错误处理和异常处理是保证程序稳定性和健壮性的关键...
4
Python数据转换攻略:字符串、列表、...
Python字典、字符串及列表的相互转换Python中数据转换的艺术:从字典和字...
5
Python列表相加与求和技巧解析
重温python基础:列表相加的方法(两个list[]加法)今天,我们来看看Py...
6
Python运行快捷键大揭秘:高效操作,...
python运行按哪个键运行Python时的快捷键包括Ctrl+Shift+F1...
7
Python字符与数字互转攻略:轻松掌握...
python 字符与数字如何转换Python是一种功能强大且结...
8
Python字符串转列表:两种常用方法解...
python怎么将字符串转换为列表Python中将字符串转换为列表的方法有多种,...
9
Python字符串转列表:两种常用方法解...
python怎么将字符串转换为列表在Python中将字符串转换为列表的方法有很多...
10
Python列表转字符串全攻略:掌握四种...
Python列表到字符串–如何在Python中转换列表在Python中,将列表转...