当我想在python中清空一个名为a的列表时,del a [:]和a = []之间有什么区别?

ebe*_*ola 34 python

请问清空列表最有效的方法是什么?

我有一个名单a = [1,2,3].要删除我经常写的列表内容a = [ ].我遇到了一个名为python的函数del.我想知道del a [:]我和之间是否存在差异.

Amb*_*ber 62

存在差异,它与是否从多个位置/名称引用该列表有关.

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

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

使用del a[:]清除现有列表,这意味着它所引用的任何地方都将变为空列表.

使用a = []集合a指向新的空列表,这意味着引用原始列表的其他位置将保持非空.

理解这里的关键是要意识到当你为变量赋值时,它只会使该名称指向一个东西.事物可以有多个名称,改变名称指向的东西不会改变事物本身.

  • @JosiahDaniels,技术上只有`a`不是列表的最后一个引用才能成立.如果是,那么重新分配它将触发垃圾收集,无论如何在幕后基本上调用`del a [:]`. (3认同)

pai*_*ima 11

这可能最好显示:

>>> a = [1, 2, 3]
>>> id(a)
45556280
>>> del a[:]
>>> id(a)
45556280
>>> b = [4, 5, 6]
>>> id(b)
45556680
>>> b = []
>>> id(b)
45556320
Run Code Online (Sandbox Code Playgroud)

当您这样做时,a[:]您指的是"已分配"列表中的所有元素a.该del语句删除对对象的引用.因此,正在做的del a[:]是"从分配给列表的列表中删除对象的所有引用a".列表本身没有改变.我们可以通过id函数看到这个,它给出了一个表示内存中对象的数字.使用之前del和之后列表的id 保持不变,表示分配了相同的列表对象a.

另一方面,当我们为其分配一个非空列表b然后分配一个新的列表时b,id会改变.这是因为我们实际上已将b引用从现有[4, 5, 6]列表移动到新[]列表.

除了您正在处理的对象的身份之外,还有其他事项需要注意:

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

双方ba指向同一个列表.从a列表中删除元素而不更改列表本身会改变列表的位置.作为b参考相同的对象,我们在那里看到相同的结果.如果你这样做了a = [],那么ab继续引用列表的同时将引用一个新的空[1, 2, 3]列表.


Rah*_*pta 6

>>> list1 = [1,2,3,4,5]
>>> list2 = list1
Run Code Online (Sandbox Code Playgroud)

为了更好地理解,让我们在图片的帮助下看到内部发生的事情.

>>> list1 = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

这将创建一个列表对象并将其分配给list1. 在内存中初始化list1

>>> list2 = list1
Run Code Online (Sandbox Code Playgroud)

list1引用的列表对象也被分配给list2.

现在,让我们看看清空列表的方法以及内部实际发生的事情.

方法-1:设置为空列表[]:

>>> list1 = []
>>> list2
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

将list1设置为空列表

这不会删除列表的元素,但会删除对列表的引用.所以,list1现在指向一个空列表,但所有其他引用都可以访问那个旧列表list1.
此方法只创建一个新的列表对象并将其分配给list1.任何其他参考将保留.

方法-2:使用切片运算符[:]删除:

>>> del list1[:]
>>> list2
[]
Run Code Online (Sandbox Code Playgroud)

使用切片运算符删除list1的所有元素

当我们使用切片运算符删除列表的所有元素,然后引用它的所有位置时,它就变成一个空列表.所以list2也成了一个空列表.