网站搜索

如何在 Python 中清除列表。为什么清除列表会删除其他变量中的副本


为什么在Python中清除列表会删除它在其他变量中的副本

Python 中清除列表可以通过多种方式完成,如果您不知道差异和幕后情况,其中一些可能会导致意外结果。

让我们看一个非常简单的脚本,它没有做任何有意义的事情,但会演示我的意思:


temp_list = list()
dict_config = dict()

for l in ['a', 'b', 'c']:
	for n in range(1,4):
		temp_list.append(l + str(n))
	dict_config[l] = temp_list
	temp_list.clear()

print(dict_config)

该脚本创建一个列表和一个字典。然后它运行两个循环,其中一个循环是嵌套的。嵌套循环填充一个列表,然后将该列表附加到字典中(使用可迭代对象之一作为键)。临时列表被清除,以便可以在同一循环中一次又一次地使用它,但使用不同的数据。

您期望什么输出?

根据脚本作者的说法,结果应该是一个包含以下内容的字典:


{'a': ['a1', 'a2', 'a3'], 'b': ['b1', 'b2', 'b3'], 'c': ['c1', 'c2', 'c3']}

但执行脚本时实际得到的是什么呢?

得到的结果:


{'a': [], 'b': [], 'c': []}

也就是说,字典确实已创建,它有键,但值(应该是临时列表)是空的。

这个例子是一个脚本片段的改编,具有更有意义的功能。但是,无论如何,列表都可以用作动态数据的临时存储,所以我们需要弄清楚问题到底出在哪里。

脚本中没有逻辑错误——问题在于列表的清除方式。

如何在Python中清除列表

Python 中的列表可以通过多种方式清除,这导致两种可能的选择:

1) 其中一种方法“就地”工作,即清除存储列表内容的那些存储单元。即使列表作为值保存到字典中后,字典也不会存储列表中信息的副本,而是存储对列表所在内存区域的引用。这导致这样一个事实:如果列表被清除,字典中的它也会被清除,因为这不是重复数据,而只是对现在什么都没有的内存区域的引用。

2)第二种清除方法只是简单地创建一个新的列表对象并将其赋值给同名的变量(同一个变量)。通过这种清除方法,先前保存到词典中的列表不受影响。

让我们考虑同一个脚本,其中该行


temp_list.clear()

被替换为以下行:


temp_list = []

即,选择分配新的空值作为清除方法。


temp_list = list()
dict_config = dict()

for l in ['a', 'b', 'c']:
	for n in range(1,4):
		temp_list.append(l + str(n))
	dict_config[l] = temp_list
	temp_list = []

print(dict_config)

在这种情况下,脚本将按预期工作。

就地清除列表并创建新列表(重新初始化)

因此,有以下方法可以“就地”清除列表:


temp_list.clear()

del temp_list[:]

temp_list*=0

当使用这些清除列表的方法时,存储列表的存储区域被清除,并且引用该存储区域的列表的副本也被清除。

有一种方法可以使用重新初始化来删除列表:


temp_list = []

重新创建同名列表不会导致存储在其他变量中的列表副本丢失。