【发布时间】:2014-06-13 10:17:25
【问题描述】:
我通常在我的代码中使用del 来删除对象:
>>> array = [4, 6, 7, 'hello', 8]
>>> del(array[array.index('hello')])
>>> array
[4, 6, 7, 8]
>>>
但我听说many people 说del 的使用是非pythonic。使用del 是不好的做法吗?
>>> array = [4, 6, 7, 'hello', 8]
>>> array[array.index('hello'):array.index('hello')+1] = ''
>>> array
[4, 6, 7, 8]
>>>
如果不是,为什么在 python 中有很多方法可以完成相同的事情?一个比其他的好吗?
选项 1:使用del
>>> arr = [5, 7, 2, 3]
>>> del(arr[1])
>>> arr
[5, 2, 3]
>>>
选项 2:使用list.remove()
>>> arr = [5, 7, 2, 3]
>>> arr.remove(7)
>>> arr
[5, 2, 3]
>>>
选项 3:使用list.pop()
>>> arr = [5, 7, 2, 3]
>>> arr.pop(1)
7
>>> arr
[5, 2, 3]
>>>
选项 4:使用切片
>>> arr = [5, 7, 2, 3]
>>> arr[1:2] = ''
>>> arr
[5, 2, 3]
>>>
如果这个问题似乎是基于意见的,我很抱歉,但我正在为我的问题寻找一个合理的答案,如果我没有得到合适的答案,我会在 2 天后添加赏金。
编辑:
由于使用del 删除对象的某些部分有许多替代方法,所以del 剩下的一个独特因素是它能够完全删除对象:
>>> a = 'hello'
>>> b = a
>>> del(a)
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
'hello'
>>>
但是,使用它来“取消定义”对象有什么意义?
另外,为什么下面的代码会改变这两个变量:
>>> a = []
>>> b = a
>>> a.append(9)
>>> a
[9]
>>> b
[9]
>>>
但是del语句没有达到同样的效果?
>>> a = []
>>> b = a
>>> del(a)
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
[]
>>>
【问题讨论】:
-
很多人 [需要引用]。谁说的,说这句话的背景是什么?
-
问题是所有这些操作都会修改输入列表并且是线性时间的。这有点浪费,因为您可以创建一个新列表,同时在线性时间内删除元素,同时保留旧列表
-
btw Python 列表是列表而不是数组; python中也有数组,所以最好不要将列表变量称为“数组”。
-
del的 use 可能还不错,但是删除列表索引的语法del的存在是该语言的一个尴尬特性,就像 @ 987654342@,这两个都惹恼了那些抱怨它与其他流行语言不符而没有明确理由的新手。 -
@SargeBorsch 所以如果有人有一个可以一步完成的三重嵌套循环,我们应该告诉他们切换到 C,对吗?
标签: python slice mutable side-effects