我真的想不出Python需要del关键字的任何原因(而且大多数语言似乎都没有类似的关键字)。例如,与其删除变量,还不如将None赋值给它。当从字典中删除时,可以添加del方法。

在Python中保留del是有原因的吗,还是它是Python前垃圾收集时代的遗迹?


当前回答

我想详细说明公认的答案,以强调将变量设置为None与使用del删除变量之间的细微差别:

给定变量foo = 'bar',函数定义如下:

def test_var(var):
    if var:
        print('variable tested true')
    else:
        print('variable tested false')

一旦初始声明,test_var(foo)产生的变量测试为true。

现在试一试:

foo = None
test_var(foo)

它产生的变量测试为假。

将这种行为与以下行为进行对比:

del foo
test_var(foo)

现在会引发NameError: name 'foo'没有定义。

其他回答

"del"命令对于控制数组中的数据非常有用,例如:

elements = ["A", "B", "C", "D"]
# Remove first element.
del elements[:1]
print(elements)

输出:

[' b ', ' c ', ' d ']

首先,你可以删除除局部变量之外的其他东西

del list_item[4]
del dictionary["alpha"]

这两者显然都是有用的。其次,在局部变量上使用del使意图更加明确。比较:

del foo

to

foo = None

我知道在del foo的情况下,目的是从作用域中删除变量。foo = None是否这样做还不清楚。如果有人只是赋值foo = None,我可能会认为这是死代码。但我立刻就知道,编码del foo的人想要做什么。

另一个小众案例,但很有用。

from getpass import getpass

pass = getpass()
token = get_auth_token(pass)
del pass

# Assume more code here...

在删除pass变量之后,您不会冒它稍后被错误打印出来的风险,或者以其他方式结束在日志或堆栈跟踪中。

我想详细说明公认的答案,以强调将变量设置为None与使用del删除变量之间的细微差别:

给定变量foo = 'bar',函数定义如下:

def test_var(var):
    if var:
        print('variable tested true')
    else:
        print('variable tested false')

一旦初始声明,test_var(foo)产生的变量测试为true。

现在试一试:

foo = None
test_var(foo)

它产生的变量测试为假。

将这种行为与以下行为进行对比:

del foo
test_var(foo)

现在会引发NameError: name 'foo'没有定义。

del所做的部分(来自Python语言参考):

删除名称将从本地或全局名称空间删除该名称的绑定

将None赋值给名称不会删除名称与名称空间的绑定。

(我想关于移除名称绑定是否真的有用可能会有一些争论,但这是另一个问题。)