在Python中,del和delattr哪个更好?

237 投票
8 回答
119265 浏览
提问于 2025-04-15 12:52

这可能听起来有点傻,但我心里一直在想这个问题。

在Python中,我们有两种内置的方法可以从对象中删除属性,分别是del命令和delattr这个内置函数。我个人更喜欢delattr,因为我觉得它更清楚明了:

del foo.bar
delattr(foo, "bar")

不过,我在想它们之间是否有一些潜在的不同之处。

8 个回答

20

毫无疑问,前者更好。在我看来,这就像在问 foo.bar 是否比 getattr(foo, "bar") 更好,我觉得没有人会问这个问题 :)

50
  • del 更直接,也更高效;
  • delattr 允许动态删除属性。

看看下面的例子:

for name in ATTRIBUTES:
    delattr(obj, name)

或者:

def _cleanup(self, name):
    """Do cleanup for an attribute"""
    value = getattr(self, name)
    self._pre_cleanup(name, value)
    delattr(self, name)
    self._post_cleanup(name, value)

del 是做不到的。

334

第一种方法比第二种方法更高效。del foo.bar 这行代码会被编译成两条字节码指令:

  2           0 LOAD_FAST                0 (foo)
              3 DELETE_ATTR              0 (bar)

delattr(foo, "bar") 则需要五条指令:

  2           0 LOAD_GLOBAL              0 (delattr)
              3 LOAD_FAST                0 (foo)
              6 LOAD_CONST               1 ('bar')
              9 CALL_FUNCTION            2
             12 POP_TOP             

这意味着第一种方法运行得 稍微 快一点(不过差别不大——在我的机器上大约快0.15微秒)。

正如其他人所说的,只有在你要删除的属性是动态决定的时候,才应该使用第二种形式。

[编辑内容以展示在函数内部生成的字节码指令,这样编译器可以使用 LOAD_FASTLOAD_GLOBAL]

撰写回答