当前位置:首页 > 内存 > 正文

python动态内存分配(c动态内存分配)

  • 内存
  • 2024-07-15 09:02:51
  • 3504

一、PYTHON的变量作用域与内存分配原理:Python中的每个变量都是一个对象,所以参数只支持引用传递。即通过名称绑定机制,将实参的值和形参的名称链接在一起。形式参数和实际参数指向内存中的同一位置。
回答问题2:
每次为变量赋值时,都会将该名称的值存储在新内存中
打印
(id
(a))
你会注意到每次f(x)时a的内存地址都是新的。所以在你的第二个问题中,L=[4,3]
与前面的L[]不是同名,所以a在附录[4,3,3]中(简单来说:L=[4,3]和L=[1,2]是两个不同名称的东西)
讨论问题1:
在你的程序中,a=1、a=2、a=5是三个元素int对象实例,这样就占用了三块不同的内存,当程序运行后内存恢复以及通过list的Append方法改变L时,这三块内存都会自然被清理掉,print
(f(1))
print
(f(2))
print
(f(5))作用于一个实例,所以内存地址不变;
情况与print
(f(3,[4,3]))L直接赋值时类似,由于
是一个新的列表实例,位置自然会发生变化。
造成上述问题的根本原因在于Python的本质:万物皆对象
(赋值过程就是对象的实例化)
看完我自己的回答:感觉真是一头雾水但我已经尽力了,如果你不明白,请在后续问题中指出!


二、Python如何进行内存管理

Python的内存管理一般看以下三个方面:

1)对象引用计数机制(四自增五自减)

2)垃圾回收机制(手动和自动,生成回收)

3)内存收集机制(m大,p小)

1)对象引用计数机制

来跟踪Python中的内存对象使用引用计数的简单技术。count(a)可以检查对象a的引用计数,但是比正常计数多了1,因为调用函数时传入了a,这会让a的引用计数增加1

2)垃圾收集机制

吃多了总会发胖,Python也是如此。随着Python中的对象越来越多,它们会占用越来越多的内存。但你不用太担心Python的大小,它会在适当的时候“减肥”,启动垃圾收集(garbagecollection)并清理掉无用的对象

。一个基本原理,当Python中一个对象的引用数下降到0时,就意味着没有引用指向该对象,该对象就成为垃圾被回收

例如,一个新的对象被分配了引用,该对象的引用号变为1。如果删除该引用,该对象的引用号达到0,则该对象可能会被垃圾回收。

然而,减肥是昂贵且困难的。在垃圾收集期间,Python无法执行其他任务。频繁的垃圾回收会大大降低Python的工作效率。如果内存中的对象不多,则不需要一直启动垃圾回收。

所以Python只有在特定条件下才会自动启动垃圾回收。Python运行时,会记录对象分配(object
allocation)和对象释放(objectdeallocation)的数。当两者之间的差值高于某个阈值时,垃圾收集就会开始。

我们可以通过gc模块的get_threshold()方法查看阈值。

3)内存池机制

Python分为大内存和小内存:(256K是大小内存的限制)

1使用malloc内存分配

2小内存使用内存池分配

Python中的内存管理机制有两套实现方式,当大小小于256K时,使用pymalloc当大于256K时会申请内存池中的内存空间,会直接执行系统malloc行为来申请内存空间。


三、Python如何管理内存Python中的内存管理是从三个方面来完成的:一是对象引用计数机制,二是垃圾回收机制,三是内存池机制
1.对象引用计数机制。
Python使用内部引用计数来跟踪内存中的对象,所有对象都有引用计数。
链接数量增加的情况:
1.给对象一个新名称
2.将其放入容器(例如列表、元组或字典)
链接。减量情况:
1.使用del运算符显式销毁对象别名
2.引用超出范围或被重新分配
count()函数可以获取当前引用。
在大多数情况下,链接的数量比您想象的要多得多。对于不可变数据(例如数字和字符串),解释器会在程序的不同部分之间划分内存以节省内存。
2.垃圾收集
1.当一个对象的引用计数达到零时,它将被垃圾收集机制处理。
2.当两个对象ab互相引用时,del语句可以减少a和b的引用计数并销毁用于引用底层对象的名称。但是,由于每个对象都包含其他对象的附件,因此引用计数不会被重置,并且该对象也不会被销毁。(从而导致内存泄漏)。为了解决这个问题,解释器定期运行循环检测器,循环搜索不可访问的对象并将其删除。
3.内存池机制
Python提供了内存的垃圾回收机制,但它将未使用的内存放入内存池中,而不是将其返回给操作系统。
oc机制。为了提高Python执行效率,Python引入了内存池机制来管理小块内存的申请和释放。
中所有小于256字节的对象都使用pymalloc实现的分配器,而大对象则使用系统的malloc。
中的整数、浮点数、列表等对象都有自己独立的私有内存池,并且它们的内存池在对象之间不共享。这意味着,如果分配和释放大量整数,则用于缓存这些整数的内存将无法再分配给浮点数。