清除清单的不同方法


207

当您想在Python中清除列表时,有什么理由要做比这两行之一更复杂的事情吗?

old_list = []
old_list = list()

我问的原因是我在一些正在运行的代码中看到了这一点:

del old_list[ 0:len(old_list) ]

1
你为什么做这个?垃圾收集工作。为什么不简单地忽略旧列表值并让Python自动清除它呢?
S.Lott

40
@ S.Lott:张贴者没有编写代码,而是在问为什么原始作者会写代码。
约翰·富希

1
您也可以这样做:而l:l.pop()
RoadieRich

12
大声笑。我确信那是有效的。
2009年

18
与您的问题无关,但在指定切片时不应使用len。a[:x]表示从x开始,a[x:]表示x结束。a[ 0:len(a) ]可以写成a[:]。您还可以使用底数从末尾开始计数(a[-1]是最后一个元素)。
idbrii 2011年

Answers:


356

清除适当的列表将影响同一列表的所有其他引用。

例如,此方法不会影响其他引用:

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]

但这确实做到了:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]      # equivalent to   del a[0:len(a)]
>>> print(a)
[]
>>> print(b)
[]
>>> a is b
True

您也可以这样做:

>>> a[:] = []

86
您也可以这样做del a[:]
idbrii 2011年

1
为什么第一个只会影响a?我以为ab提到了同一个对象...想知道为什么。谢谢。
Alston 2014年

37
使用python 3.3及更高版本,您可以使用a.clear(),没问题!
Marek Lewandowski

4
@Stallman,因为首先您要更改对“ a”的引用以指向新数组,而不是清除其中一个,而b仍指向旧数组
Pax0r 2015年

4
如果任何人都可以证明这些方法之间的性能差异,那就太好了!
Suanmeiguo

37

这样alist = []做不会清除列表,只会创建一个空列表并将其绑定到变量alist。如果旧列表具有其他变量绑定,它将仍然存在。

要实际上就地清除列表,可以使用以下任何一种方法:

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

有关更多详细信息,请参见可变序列类型文档页面。


2
我已经测试过,alist * = 0是最快的,下一个最快的是alist.clear(),其他两种方法也同样快。您能解释一下为什么alist * = 0最快吗?
詹妮

3
@Jenny:它只是在后台使用更少(或更便宜)的操作码。例如,操作员版本不需要查找任何方法名称或构建切片。
尤金·雅玛什

“应该有一种-最好只有一种-明显的方式来做到这一点。” Python在这里闪闪发光:)
Nik O'Lai

36

有一种清除python列表的非常简单的方法。使用del list_name [:]

例如:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []

13

在我看来,del会给您内存,而分配新列表将仅在gc运行时删除旧列表。

这对于大型列表可能很有用,但对于小型列表则应该忽略不计。

编辑:作为Algorias,没关系。

注意

del old_list[ 0:len(old_list) ]

相当于

del old_list[:]

2
gc不是周期运行的。删除最后一个引用后,该列表将被释放。
2009年

2
算法:对于CPython是正确的,但可能不适用于其他实现。
mhsmith 2011年

2
del old_list [0:len(old_list)]和del old_list [:]的结果相同,但后者的速度更快(在python 2.6中检查)
Roy Nieterau 2013年

6
del list[:] 

将删除该列表变量的值

del list

将从存储器中删除变量本身


5

在两种情况下,您可能需要清除列表:

  1. 您想old_list在代码中进一步使用该名称;
  2. 您希望尽快对旧列表进行垃圾回收,以释放一些内存。

在第一种情况下,您只需继续进行以下操作:

    old_list = []    # or whatever you want it to be equal to

在情况2中,该del语句将减少对名称所old list指向的列表对象的引用计数。如果列表对象仅由其名称指向old_list,则引用计数将为0,并且该对象将被释放以进行垃圾回收。

    del old_list

3

如果您要清除列表,显然,您不再需要该列表。如果是这样,您可以通过简单的del方法删除整个列表。

a = [1, 3, 5, 6]
del a # This will entirely delete a(the list).

但是,以防万一,您再次需要它时,可以重新初始化它。或者只是简单地通过清除其元素

del a[:]

-4

另一个可行的解决方案是创建一个空列表作为参考空列表。

empt_list = []

例如,您有一个列表 a_list = [1,2,3]。要清除它,只需执行以下操作:

a_list = list(empt_list)

a_list就像一样,这将使一个空列表empt_list


没有理由创建empt_list。只需使用a_list = list()。
丹尼尔·哈丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.