在Python中,del和delattr哪个更好?
这可能听起来有点傻,但我心里一直在想这个问题。
在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_FAST
和 LOAD_GLOBAL
]