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

时间:2017-03-01 22:20:34

标签: python memory-management binding

例如,我有以下Python代码:

>>> x = 9.89

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

2 个答案:

答案 0 :(得分:4)

这都是CPython的实现细节。其他实现可能表现不同。

变量的内存分配 完全独立于它们所引用的对象类型。无论您指定x = []x = 5还是x = SomeCrazyHugeThing(),该值都不会影响为x分配的内存。输入函数调用时,局部变量在Python堆栈框架PyObject *中被分配为f_localsplus;其他变量是"已分配"在第一次分配时作为相应命名空间的dict中的dict个条目。 (疯狂的元类和exec恶作剧可以用奇怪的方式改变这种情况,但我们不会进入那种情况。)

变量的那个。与示例代码中float表达式求值的9.89实例一样,对象的分配方式也不同。每种类型负责在创建类型的实例时分配内存,并在对象增长,收缩或销毁时根据需要重新分配或取消分配内存。完成此操作的方式取决于类型。

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

答案 1 :(得分:2)

Python Memory Management

  

Python做了很多分配和解除分配。所有物品,   包括整数和浮点数等“简单”类型存储在   堆。为每个变量调用malloc和free会非常慢。   因此,Python解释器使用各种优化的内存   分配方案。最重要的是malloc实现   名为pymalloc,专门用于处理大量的   小额拨款。任何小于256字节的对象都使用它   分配器,而任何更大的使用系统的malloc

Why doesn't Python release the memory when I delete a large object?

  

内存分配在Python中的多个级别都有效。有   系统自己的分配器,这是检查时显示的内容   使用Windows任务管理器或 ps 进行内存使用。那就是C   运行时的内存分配器( malloc ),它从系统获取内存   分配器,并以较小的块交给应用程序。   最后,有Python自己的对象分配器,用于   最多256个字节的对象。这个分配器抓住了大块内存   来自C分配器,并使用一个小块将它们切成小块   算法仔细调整了Python。

,特别是花车:

  

花车也使用不朽的&无限的免费清单。

所以不,它只会在蟒蛇免费列表中没有更多免费float点时分配,这取决于程序中以前的float用法。

最终,python正在为你做内存管理,所以即使是对你的问题的坚实回答也不会给你太多的洞察力。

可以在Python: garbage collection fails?

找到其他讨论