Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:是;旧的;无内存';d当变量被分配新内容时?_Python_Memory Management_Garbage Collection - Fatal编程技术网

Python:是;旧的;无内存';d当变量被分配新内容时?

Python:是;旧的;无内存';d当变量被分配新内容时?,python,memory-management,garbage-collection,Python,Memory Management,Garbage Collection,如果为变量分配了任何新内容,为“旧内容”分配的内存是否会“正确”释放?例如,在下面的脚本中,在为变量“a”分配了一些新的内容之后,作为零数组的变量“a”的内存是否会被释放 import numpy a = numpy.zeros(1000) a = a+1 我认为Python足够聪明,可以使用所谓的“垃圾收集”干净地完成每件事,我从来没有真正读过它。有确认吗?非常感谢。最终,旧内存将被释放,尽管您无法预测这将在何时发生。它取决于Python实现和许多其他因素 也就是说,对于您给出的示例和CPy

如果为变量分配了任何新内容,为“旧内容”分配的内存是否会“正确”释放?例如,在下面的脚本中,在为变量“a”分配了一些新的内容之后,作为零数组的变量“a”的内存是否会被释放

import numpy
a = numpy.zeros(1000)
a = a+1

我认为Python足够聪明,可以使用所谓的“垃圾收集”干净地完成每件事,我从来没有真正读过它。有确认吗?非常感谢。

最终,旧内存将被释放,尽管您无法预测这将在何时发生。它取决于Python实现和许多其他因素

也就是说,对于您给出的示例和CPython实现,旧数组应该在分配期间进行垃圾收集


(请注意,NumPy数组是讨论垃圾收集器行为的一个特别复杂的示例。)

您可以通过使用gc模块(可能还有微调)找到答案。它提供了禁用采集器、调整采集频率和设置调试选项的功能。它还提供对收集器找到但无法释放的不可访问对象的访问。
请参见

问题也可能会有所帮助。谢谢你,斯文。我的问题是,有时我需要操作大型矩阵。考虑到内存和速度,我总是在函数中包装东西,希望在函数结束时至少释放在函数中分配的任何额外内存。这是避免坏事的好方法吗?顺便说一句,我确实主要使用NumPy阵列,在性能和方便性方面是否有一个好的替代方案?@Liang:NumPy阵列没有合理的替代方案。如果要避免过度使用内存,请尽可能使用就地操作;请务必查看链接到此处的
numexpr
模块。对于您问题中的代码,这意味着首先要使用
a+=1
来避免任何临时数组。当一个对象的内存可以被另一个Python对象重用时,与将内存释放回操作系统时,也有区别。CPython为特定的数据类型使用了一些专门的结构,在某些情况下可以防止完全发生这种情况,而在其他情况下,碎片可能会阻止这种情况发生。谢谢你,马克。我会试试看。但对我来说,这看起来很可怕。实际上我在想,是否有一个“一般”原则,比如“用函数包装东西”。谢谢你的建议。