Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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-列表的垃圾收集器_Python - Fatal编程技术网

Python-列表的垃圾收集器

Python-列表的垃圾收集器,python,Python,我做了一个简单的循环,在每次迭代中,在列表中附加一个数字。 程序完成后,列表使用的内存是否会自动释放 任何人都可以向我解释一下吗?是的,当程序终止时,所有内存都会被释放。在现代操作系统中,您无法保留内存,也无法在进程终止时不释放内存 垃圾收集器用于在程序终止之前释放内存。这样长时间运行的程序就不会保留计算机的所有资源 如果您有一个大数据结构,并且希望垃圾收集器来处理它(释放它所使用的内存),那么您应该在使用完它之后删除对它的所有引用。在这种情况下,简单的del list就足够了。是的,当程序终止

我做了一个简单的循环,在每次迭代中,
在列表中附加一个数字。
程序完成后,列表使用的内存是否会自动释放


任何人都可以向我解释一下吗?

是的,当程序终止时,所有内存都会被释放。在现代操作系统中,您无法保留内存,也无法在进程终止时不释放内存

垃圾收集器用于在程序终止之前释放内存。这样长时间运行的程序就不会保留计算机的所有资源


如果您有一个大数据结构,并且希望垃圾收集器来处理它(释放它所使用的内存),那么您应该在使用完它之后删除对它的所有引用。在这种情况下,简单的
del list
就足够了。

是的,当程序终止时,内存将被释放,在大多数实现中,当对该列表的引用计数达到零时,也就是说,当作用域中没有指向该值的变量时,内存也将被释放

您还可以使用GC模块手动控制GC

如果您只是在列表上进行迭代,并且列表足够大,以至于您担心内存消耗,那么您可能应该检查Python生成器和生成器表达式

因此,不是:

for i in range(100000):
    results.append(do_something_with(i))

for result in results:
    do_something_else_with(result)
你可以写:

partial =  (do_something_with(i) for i in range(100000))
for result in partial:
    do_something_else_with(result)
或:


等等。。。这样,您就不必在内存中分配整个列表。

是的,操作系统会在进程终止后释放进程使用的内存。Python与此无关

但是,Python本身具有自动垃圾收集功能,因此它可以在运行Python程序时释放不再需要的所有内存

最后,您可能只需要使用:

if __name__ == '__main__':
    list = range(100000)

要实现与您编写的完全相同的功能。

终止后,所有内存将被释放,但如果您希望在执行期间高效地创建这么大的列表,请使用
xrange
,它会动态生成数字

    alist = [i for i in xrange(10000)]

您不必担心在python中释放内存,因为这是程序的自动特性。Python使用引用计数来管理内存,当不再引用某些内容时,Python将自动相应地分配内存。换句话说,删除对列表的所有引用应该足以释放分配给它的内存

也就是说,如果程序很大,可以使用
gc.collect()
让垃圾收集器释放一些内存。然而,这通常是不必要的,因为Python的垃圾收集器设计得足够好


此外,尽管不建议这样做,而且通常也不太有用,但您也可以使用
gc.disable()
禁用Python的自动垃圾收集器,这允许您作为用户以近乎C风格的方式手动分配内存。

不必立即,但最终,可能在需要的时候。这个问题的答案可能重复,在这里以及其他问题中都有介绍。。。请记住,这是特定于python实现的。。。但一般来说是的,如果
列表
在其他地方引用了什么?
delete list
是否足以释放内存?@Bolboa包括嵌入到其他结构(如数组或字典)中的引用。请注意,这是Python 2特有的,
xrange
在Py3中不存在。相反,
range
现在是一个生成器。
if __name__ == '__main__':
    list = range(100000)
    alist = [i for i in xrange(10000)]