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

30

当我在原型脚本上工作时,我倾向于使用以下方法:

  1. 使用一个比较常见的变量(例如fileCount),并且
  2. 有一个大的方法(20行以上),并且
  3. 尚未使用类或命名空间。

在这种情况下,为了避免潜在的变量冲突,我会在完成后立即删除该变量。我知道,在生产代码中,我应该避免1、2和3,但是从一个能工作的原型到完全优化的类需要耗费时间。有时候我可能想要做一个次优的、快速的重构工作。在这种情况下,我会发现保留del语句很方便。我是否正在养成一个不必要的坏习惯?del是否完全可避免?什么时候使用del是个好主意?


1
我同意这很有用。我知道我已经被循环变量泄漏咬过,然后被设置了不应该设置的值。 - Josh Lee
1
“del” 是完全可以避免使用的吗?-> 你只需要在 del mydict[key] 等情况下使用它。 - Jochen Ritzel
1
@nate c,(至少我)关心的不是性能,而是重新使用一个变量(由于拼写错误/代码组织不佳),它从for循环和/或以前的代码块中溢出,并带有错误的值。复制粘贴类型的代码特别容易出错 ;) - Hamish Grubijan
1
通过向已经为您完成的事情添加不必要的逻辑,这样做就失去了目的。名称冲突是任何语言中的一个错误(无论是否具有内存管理功能),可以通过其他方式解决。 - nate c
2
相关:Python中什么时候使用del有用? - Piotr Dobrogost
显示剩余2条评论
2个回答

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 并不是一个真正的“代码异味”,但它可能与某些异味相关联。


1
del 的作用并不是完全删除对象的引用,它的作用是将变量的引用计数减1,并从命名空间中删除绑定的变量名。 - mouad
14
删除一个对象的引用意味着将其从命名空间中移除并减少引用计数。如果Python实现使用引用计数,那么这意味着减少引用计数。如果没有使用引用计数,则del只能执行前者而不能执行后者。 - Rosh Oxymoron
1
好的,是的,也许我没有理解好 : ),不要介意 +1; - mouad

9
任何已经进行了函数、类以及方法的良好组织的代码,在非特殊情况下都不需要使用del。从开始构建你的应用程序就要着重考虑使用更多的函数和方法,避免重复使用变量名等方式来使你的应用程序结构更加清晰。

使用del语句是可以的 - 它不会导致任何问题,我常常在我的系统上使用Python代替shell脚本,进行脚本实验时也经常使用它。但是,如果在一个真正的应用程序或库中经常出现这种情况,那么这可能是一个不良结构化的代码迹象。我从来没有在应用程序中使用过它,在发布过的代码中很少看到它被使用。


我甚至不在脚本中使用它……我的脚本不会那么长 😉 - user395760
@delnan,如果你包含了合理的错误检查,脚本很快就会变得更长。如果这些脚本只是为了你自己的[调试]目的而编写的-那么没问题。但是,如果你的脚本依赖于其他脚本或构建过程的输出结果,我认为最好预见到输出格式的变化,并在发现问题时立即退出并提供有用的错误信息。 - Hamish Grubijan
@Hamish:是的,但那更多的是ifprint语句,而不是更多的变量。 - user395760
3
仍然有用于从字典中删除内容。 - Antimony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接