首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中,del和delattr哪个更好?

在python中,del和delattr哪个更好?
EN

Stack Overflow用户
提问于 2009-07-13 17:33:34
回答 8查看 104.4K关注 0票数 212

这可能有点傻,但它已经困扰了我一段时间。

Python为我们提供了两种从对象中删除属性的内置方法,del命令字和delattr内置函数。我更喜欢delattr,因为我认为它更明确一些:

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

但我想知道他们之间是否有本质上的不同。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-07-13 17:58:51

第一种方法比第二种方法更有效。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             

这意味着第一次运行的速度会稍微快一些(但这并没有太大的区别--在我的机器上运行.15μ)。

正如其他人所说,当您要删除的属性是动态确定的时,您实际上应该只使用第二种形式。

编辑以显示在函数中生成的字节码指令,其中编译器可以使用LOAD_FASTLOAD_GLOBAL

票数 305
EN

Stack Overflow用户

发布于 2013-10-15 19:49:04

  • del更加明确,efficient;
  • 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做到这一点。

票数 43
EN

Stack Overflow用户

发布于 2009-07-13 17:55:06

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1120927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档