在Python中,使用`del`语句算是一种代码异味吗?

30 投票
2 回答
6862 浏览
提问于 2025-04-16 09:00

我通常在做原型脚本的时候会用到这个,具体情况是:

  1. 使用一个比较常见的变量(比如 fileCount),
  2. 有一个比较大的方法(超过20行),
  3. 还没有使用类或命名空间。

在这种情况下,为了避免变量冲突,我会在完成后立刻删除这个变量。我知道,在正式的代码中,我应该尽量避免上述的1、2和3,但从一个能用的原型变成一个完全完善的类是很耗时间的。有时候我可能会选择做一个不太完美的快速重构。在这种情况下,我觉得保留 del 语句是很方便的。我是在养成一个不必要的坏习惯吗?del 是不是完全可以避免?在什么情况下使用它是好的呢?

2 个回答

9

如果你的代码组织得很好,比如用函数、类和方法来划分,那么通常不需要用到del,除非遇到特别的情况。从一开始就要努力把你的应用设计得合理,尽量多用函数和方法,避免重复使用变量名等等。

使用del语句是可以的——它不会造成什么麻烦。我在用Python替代系统中的shell脚本时,或者在做一些脚本实验时,常常会用到它。不过,如果在一个真正的应用程序或库中经常看到它,那就说明可能有问题,可能是代码结构不太好。我在应用程序中从来没需要用过它,而在发布的代码中你也很少能看到它的身影。

26

我觉得单独使用 del 并不是一个坏习惯。

在同一个命名空间里重复使用变量名绝对是个坏习惯,像不适当地使用类和其他命名空间也是。所以,如果用 del 来处理这些问题,那就可能是个坏习惯。

我能想到的 del 的唯一合适用法就是用来打破循环引用,而循环引用通常也是个坏习惯(而且很多时候其实并不需要这样做)。记住,del 只是删除了对对象的引用,并不是删除对象本身。对象的清理工作会通过引用计数或垃圾回收来完成。

>>> a = [1, 2]
>>> b = a
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
[1, 2]

你可以看到,在 del 语句之后,列表依然存在,因为 b 仍然持有对它的引用。

所以,虽然 del 本身并不算是坏习惯,但它可能和一些坏习惯有关联。

撰写回答