清除列表的不同方式

joh*_*nix 198 python list

当你想在Python中清除一个列表时,有没有理由做这些比这两行更复杂的事情?

old_list = []
old_list = list()
Run Code Online (Sandbox Code Playgroud)

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

del old_list[ 0:len(old_list) ]
Run Code Online (Sandbox Code Playgroud)

Kob*_*oba 348

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

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

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

但是这个做了:

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

你也可以这样做:

>>> a[:] = []
Run Code Online (Sandbox Code Playgroud)

  • 你也可以做`del a [:]` (84认同)
  • 使用**python 3.3**以及之后你可以使用`a.clear()`,没问题! (35认同)
  • @Stallman因为首先你要更改'a'的引用指向新数组,而不是清除一个,b仍然指向旧数组 (4认同)
  • 如果有人能够展示这些方法之间的性能差异,那就太棒了! (4认同)

Nix*_*Man 36

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

例如:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []
Run Code Online (Sandbox Code Playgroud)


Eug*_*ash 20

要在Python 3.3+中就地清除列表,您也可以使用alist = [],这与其他可变容器(例如alist,alist.clear() # Python 3.3+, most obviousdel alist[:])的接口一致.

__PRE__

  • “应该有一种——最好只有一种——明显的方法来做到这一点。” Python 在这里闪耀:) (5认同)
  • 我已经测试过, alist *= 0 是最快的,其次是 alist.clear() ,其他两种方法同样快。你能解释一下为什么 alist*= 0 是最快的吗? (4认同)
  • @Jenny:它只是在幕后使用了更少(或更便宜)的[opcodes](https://docs.python.org/3/library/dis.html)。例如,操作员版本不需要查找任何方法名称或构建切片。 (2认同)

bes*_*sen 13

在我看来,del会给你回忆,而分配一个新列表只会在gc runs.matter时删除旧列表.

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

编辑:作为Algorias,没关系.

注意

del old_list[ 0:len(old_list) ]
Run Code Online (Sandbox Code Playgroud)

相当于

del old_list[:]
Run Code Online (Sandbox Code Playgroud)

  • gc不是循环运行的.删除最后一个引用后立即释放该列表. (2认同)
  • Algorias:这对CPython来说是正确的,但可能不适用于其他实现. (2认同)
  • del old_list [0:len(old_list)]和del old_list [:]的结果相同,但后者的速度更快(在python 2.6中检查) (2认同)

Ale*_*lex 5

在两种情况下,您可能希望清除列表:

  1. 您希望old_list在代码中进一步使用该名称;
  2. 你希望旧列表尽快被垃圾收集以释放一些内存;

在案例1中,您继续使用该分配:

    old_list = []    # or whatever you want it to be equal to
Run Code Online (Sandbox Code Playgroud)

在案例2中,del语句会将引用计数减少到名称所old list指向的列表对象.如果列表对象仅由名称old_listat 指向,则引用计数将为0,并且将释放该对象以进行垃圾回收.

    del old_list
Run Code Online (Sandbox Code Playgroud)


ytp*_*lai 5

del list[:] 
Run Code Online (Sandbox Code Playgroud)

将删除该列表变量的值

del list
Run Code Online (Sandbox Code Playgroud)

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