Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Python 2.7_Memory - Fatal编程技术网

在python中完全删除列表

在python中完全删除列表,python,list,python-2.7,memory,Python,List,Python 2.7,Memory,我正在使用python 2,并试图删除两个列表。 代码如下: test_data1 = [img for img in glob.glob("/location/of/images/*png")] test_data0 = [img for img in glob.glob("/location/of/other_images/*png")] test_data = test_data1 + test_data0 每个图像列表都包含数百万个文件名,因此我希望在创建test_data列表后删除不

我正在使用python 2,并试图删除两个列表。 代码如下:

test_data1 = [img for img in glob.glob("/location/of/images/*png")]
test_data0 = [img for img in glob.glob("/location/of/other_images/*png")]
test_data = test_data1 + test_data0
每个图像列表都包含数百万个文件名,因此我希望在创建
test_data
列表后删除不必要的列表。只是为了使代码“更容易”让计算机运行

我怎么做

我发现了一些不同的方法,但没有任何一种方法可以解决记忆问题。我不确定
test\u data1=[]
是否真的从内存中完全删除了列表

另外,我担心
test\u data=test\u data1+test\u data0
行只合并了列表的散列,当我删除这两个列表时,
test\u data
也会变为空

所以。。正确的方法是什么

非常感谢你的帮助! 对不起,如果英语不好,我不是以英语为母语的人


谢谢

您可以使用列表连接来消除对中间列表的需要

test_data = []
test_data += [img for img in glob.glob("/location/of/images/*png")]
test_data += [img for img in glob.glob("/location/of/other_images/*png")]
另外,我不确定您的程序的总体设计是什么,但是Python中有一种偏好,就是出于这个原因,使用迭代器/生成器而不是列表。你一次记住的东西越少越好。看看你是否可以重新设计你的程序,让它在运行中迭代,而不是建立一个庞大的列表。

你可以使用。这将实例化一个列表并用这些项目填充它,extend将把该列表附加到
test\u data
中。这样,列表在内存中的唯一位置将位于
test\u data
中。而不是多个实例。这是否会对性能产生任何实际影响只能通过测试/分析来确定

test_data = []
test_data.extend([img for img in glob.glob("/location/of/images/*png")])
test_data.extend([img for img in glob.glob("/location/of/other_images/*png")])
或者使用,清除该变量的绑定(垃圾收集器将删除未使用的值)


在其他答案中添加新数据到数组的选项是有效的,但是如果要保持两个数组并添加它们,请考虑使用垃圾回收器。 Python有一个垃圾收集器,当对象不再使用时(即当对象不可访问且不再被引用时),它将删除对象。例如,如果您有该程序:

a = [1, 2, 3, 4]
a = []
#  Here data [1, 2, 3, 4] is unreachable (unreferenced)
....
垃圾收集器最终可能会删除对象[1、2、3、4]。不过,你不能保证什么时候能成功。它会自动发生,你不必对它做任何事情

但是,如果您担心内存资源,可以使用
gs.collect()
(不要忘记导入gc)强制垃圾收集器删除未引用的对象。例如:

import gc

a = [1, 2, 3, 4]
a = []
gc.collect()
#  Here it is guaranteed that the memory previously occupied by [1, 2, 3, 4] is free
所以你的程序会变成

import gc

test_data1 = [img for img in glob.glob("/location/of/images/*png")]
test_data0 = [img for img in glob.glob("/location/of/other_images/*png")]
test_data = test_data1 + test_data0

test_data1 = []
test_data0 = []

gc.collect()

事实上,每个列表存储都引用字符串,而不是字符串本身

我很确定,使用的内存大约是1Mx4(对于32位体系结构)或1Mx8(对于64位体系结构)

我建议你做分析,看

您可以使用迭代器代替列表,并将列表与链接,如下所示:

import itertools
import glob

iter1 = glob.iglob("/location/of/images/*png")
iter2 = glob.iglob("/location/of/other_images/*png")

test_data = [name for name in itertools.chain(iter1, iter2)]

特别是,在这个特定的例子中,可能会被证明是有用的。你说“删除对中间列表的需要”,但你仍然在这样做,创建中间列表。这不像
[glob.glob中img的img(“/location/of/images/*png”)]
不是一个列表。就内存使用而言,删除某些内容与原始代码没有任何区别,只需使用
del
关键字查看类似
del test\u data0
。此外,如果删除2个原始列表(例如
tset_数据0
test_数据1
),则最后一个列表(
test_数据
)将保持不变,因为它是一个新列表
import itertools
import glob

iter1 = glob.iglob("/location/of/images/*png")
iter2 = glob.iglob("/location/of/other_images/*png")

test_data = [name for name in itertools.chain(iter1, iter2)]