代码:
num_of_iterations_for_outer_loop = 2
num_of_iterations_for_inner_loop = 3
data = []
for j in range(num_of_iterations_for_outer_loop):
lst2 = []
for k in range(num_of_iterations_for_inner_loop):
lst1 = {}
lst1['1'] = "first_value" # these are not default, in my original code they are coming from some other values after calculation
lst1['2'] = "second_value"
lst1['3'] = "third_value"
lst2.append(lst1)
value = {'values':lst2}
data.append(value)
在外循环中,我必须一次又一次清除lst2
列表以重复使用它。
在内部循环中,我必须一次又一次地清除lst1
字典以重复使用它。
我知道清除列表的两种方法:
del lst2[:]
lst2 = []
和1清除字典的方法:
lst1 = {}
但我不知道这些方法与我应该使用哪种方法之间存在差异。
有没有其他方法可以清除列表和字典?这是更好的方法,为什么?
有没有更好的方法来编写整个代码?
答案 0 :(得分:4)
以下简要介绍每种方法的作用:
lst2 = []
不实际清除列表内容。它只是创建一个新的空列表并将其分配给名称lst2
。然后GC的任务是根据剩余的参考文献删除实际内容。
>>> a = [1,2,3]
>>> b = a
>>> a = []
>>> a
[]
>>> b
[1, 2, 3]
del lst2[:]
清除就地列表的内容。
>>> a = [1,2,3]
>>> b = a
>>> del a[:]
>>> a
[]
>>> b
[]
请注意,其他列表b也会被清除,因为内容已就地删除。
lst1 = {}
与第1点相同。它会创建一个空字典并指定对名称lst1
的引用。
另一种清除列表的方法是:
lst2[:] = []
答案 1 :(得分:1)
“清除”列表的两种方法之间的区别在于,第一种操作就地,删除原始列表对象的内容,而第二种方法只需创建一个新列表对象并将其指定为相同的名称。你必须在这里使用第二个版本,否则你字典中的所有列表都将是最后同一个清空列表的副本:
>>> l = [1, 2, 3]
>>> d = {'a': l}
>>> del l[:]
>>> d
{'a': []}
同样,您可以del
来自字典的所有键值对,但您会遇到同样的问题。当您将原始容器对象放入其他容器时,您应该在每个循环中通过赋值(例如lst1 = {}
)创建一个新容器。
有没有更好的方法来编写整个代码?
我不知道你对数据做了什么,但字典value
可能是不必要的,并且最内层数据的三元组就足够了:
data = [[(1, 2, 3), (4, 5, 6)], [(7, 8, 9), ...], ...]
答案 2 :(得分:0)
分配是清除列表或词典的非常好的有效方法。
my_dict = {}
和my_list = []
不需要任何花哨的东西。