标签:字符串 之间 允许 内存分配 相同 管理机 部分 实现 改变
较浅的层面来说,Python的内存管理机制主要分为以下三个方面:
一、垃圾回收:
Python不像C++、Java等语言,Python可以不用事先声明变量的类型,而可以直接对变量进行赋值,对于Python语言来说,对象的类型和内存都是在运行的时候确定的。这也是为什么我们称Python是一种动态语言的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。
二、引用计数:
Python采用了与Windows内核对象一样的方式来对内存进行管理,每一个对象,都维护这一个对指向该对象引用的计数,如下图所示(图片来自Python核心编程):
当我们执行以下代码:
x = 3.14
y = x
首先我们会创建一个对象3.14,然后将这个浮点数对象的引用赋值给x,因为x是第一个引用,因此,这个浮点数对象的引用计数为1。语句“y = x”创建了一个指向同一个对象的引用别名y,其实并没有为y常见一个新的对象,而是将y也指向了x指向的浮点数对象,这时候浮点数对象的引用计数为2.
我们可以用代码来证明这一点:
>>> a = 10 >>> b = a >>> id(a) 10418052 >>> id(b) 10418052
变量a 和 变量b的id一致(我们可以将id值想象为C中变量的指针).
我们援引另一个网址的图片来说明问题:对于C语言来讲,我们创建一个变量A时就会为为该变量申请一个内存空间,并将变量值 放入该空间中,当将该变量赋给另一变量B时会为B申请一个新的内存空间,并将变量值放入到B的内存空间中,这也是为什么A和B的指针不一致的原因。如图:
而Python的情况却不一样,实际上,Python的处理方式和Javascript有点类似,如图所示,变量更像是附在对象上的标签(和引用的定义类似)。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。
三、内存池机制:
Python的内存机制可以以金字塔行表示:
在C中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:
经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同:
而对于像字典(dict),列表(List)等,改变一个就会引起另一个的改变,也称之为浅拷贝:
引用计数增加的情况:
引用计数减少的情况
垃圾回收
标签:字符串 之间 允许 内存分配 相同 管理机 部分 实现 改变
原文地址:https://www.cnblogs.com/qianyeliange/p/8836690.html