这可能有点傻,但它已经困扰了我一段时间。
Python为我们提供了两种从对象中删除属性的内置方法,del命令字和delattr内置函数。我更喜欢delattr,因为我认为它更明确一些:
del foo.bar
delattr(foo, "bar")
但我想知道他们之间是否有本质上的不同。
发布于 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_FAST
和LOAD_GLOBAL
发布于 2013-10-15 19:49:04
考虑以下示例:
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做到这一点。
发布于 2009-07-13 17:55:06
毫无疑问是前者。在我看来,这就像是在问foo.bar
是否比getattr(foo, "bar")
更好,我认为没有人会问这个问题:)
https://stackoverflow.com/questions/1120927
复制相似问题