在Python中,使用`del`语句算是一种代码异味吗?
我通常在做原型脚本的时候会用到这个,具体情况是:
- 使用一个比较常见的变量(比如
fileCount
), - 有一个比较大的方法(超过20行),
- 还没有使用类或命名空间。
在这种情况下,为了避免变量冲突,我会在完成后立刻删除这个变量。我知道,在正式的代码中,我应该尽量避免上述的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
本身并不算是坏习惯,但它可能和一些坏习惯有关联。