这可能很愚蠢,但它已经在我的大脑后面唠叨了一段时间。
Python 为我们提供了两种从对象中删除属性的内置方法, del 命令字和 delattr 内置函数。我更喜欢 delattr ,因为我认为它更明确一点:
del foo.bar delattr(foo, "bar")
但我想知道它们之间是否存在内部差异。
第一个比第二个更有效。 del foo.bar编译成两条字节码指令:
del foo.bar
2 0 LOAD_FAST 0 (foo) 3 DELETE_ATTR 0 (bar)
而delattr(foo, "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 渭s)。
就像其他人所说的那样,当您要删除的属性是动态确定的时,您真的应该只使用第二种形式。
[编辑显示函数内部生成的字节码指令,编译器可以在其中使用LOAD_FAST和LOAD_GLOBAL]
LOAD_FAST
LOAD_GLOBAL