Python中如何为变量分配内存?

Python中如何为变量分配内存?,python,memory-management,binding,Python,Memory Management,Binding,例如,我有以下Python代码: >>> x = 9.89 现在我知道类型将在运行时动态确定为float,但我不确定内存是如何分配的。确定类型后,是否会动态分配浮点大小的内存?分配的内存量是否总是相同的?这将取决于CPython的实现细节。其他实现的行为可能不同 变量的内存分配完全独立于它们引用的对象类型。无论您分配x=[],x=5,还是x=SomeCrazyHugeThing(),该值都不会影响为x分配的内存。输入函数调用时,局部变量在Python堆栈框架的f_locals

例如,我有以下Python代码:

>>> x = 9.89

现在我知道类型将在运行时动态确定为float,但我不确定内存是如何分配的。确定类型后,是否会动态分配浮点大小的内存?分配的内存量是否总是相同的?

这将取决于CPython的实现细节。其他实现的行为可能不同

变量的内存分配完全独立于它们引用的对象类型。无论您分配
x=[]
x=5
,还是
x=SomeCrazyHugeThing()
,该值都不会影响为
x
分配的内存。输入函数调用时,局部变量在Python堆栈框架的
f_localsplus
中分配为
PyObject*
;其他变量在第一次赋值时作为
dict
条目“分配”到相应名称空间的dict中。(疯狂的元类和
exec
sheanigans可以用奇怪的方式改变这一点,但我们不打算讨论这个问题。)

这是针对变量的。在示例代码中,对象(如
float
实例)和
9.89
表达式的计算结果是不同的。每个类型都负责在创建该类型的实例时分配内存,并在对象增长、收缩或销毁时根据需要重新分配或取消分配内存。执行此操作的方式取决于类型

请注意,创建对象的时间可能令人惊讶。例如,在
x=9.89
中,Python在编译该语句的字节码时创建一个
float
对象(并为其分配内存)。在字节码执行期间,Python只检索现有的
float
;未分配新的
浮动

Python执行大量的分配和解除分配。所有对象, 包括“简单”类型(如整数和浮点)存储在 堆为每个变量调用malloc和free将非常缓慢。 因此,Python解释器使用各种优化的内存 分配计划。最重要的是malloc实现 称为
pymalloc
,专门用于处理大量 少量拨款。小于256字节的任何对象都使用此 分配器,而任何较大的分配器都使用系统的
malloc

在Python中,内存分配在多个级别工作。有一个 系统自己的分配器,当您检查 使用Windows任务管理器或ps使用内存。然后是C 运行时的内存分配器(malloc),它从系统获取内存 分配器,并将其以较小的块分发给应用程序。 最后,还有Python自己的对象分配器,用于 最多256字节的对象。这个分配器获取大块内存 并使用 为Python精心调优的算法

特别是对于浮动:

浮动还使用一个不朽的无限自由列表

所以不,只有在pythons自由列表中没有更多的自由
float
点时才会分配,这取决于您的程序中以前的
float
使用情况

归根结底,python是在为您进行内存管理,因此,即使对您的问题给出可靠的答案,也不会给您带来太多的洞察力


更多的讨论可以在

上找到,如果谁否决了这项法案,谁就留下了他们认为这是错误的任何迹象,那肯定会很好。