此代码打印 a 和 b 的值,同时两者都引用包装器 ID 的 ID,并且都返回相同的 ID。
def my_decorator(func):
def wrapper():
pass
return id(wrapper)
def some_func():
pass
a = id(my_decorator(some_func))
b = id(my_decorator(some_func))
print(a)
print(b) # both return same ID
我将 a 和 b 的值插入到 f 字符串中,代码返回不同的 ID。
a = f"foo - { id(my_decorator(some_func)) }"
b = f"foo - { id(my_decorator(some_func))} "
print(a)
print(b) # return diff IDs
为什么?
在第一个代码块中,您会看到相同的 id,因为 Python 做了一些低级优化。 当
b = id(my_decorator(some_func))
执行后立即执行 a = id(my_decorator(some_func))
时,第一次调用时 my_decorator
返回的对象仍然在内存中,没有被垃圾回收。因此,当您第二次调用 my_decorator
时,会引用内存中的同一对象,因此您会看到相同的对象 ID。
在第二个使用 f 字符串的示例中,它不必生成不同的对象。这取决于第二次调用时对象是否被垃圾收集。如果使用 f 字符串进行第二次调用时该对象仍然存在于内存中,则它仍将引用与第一次调用中相同的对象并打印相同的 ID。
例子:
您的实现永远不应该依赖于语言所做的低级优化。这些优化往往会在未来的版本中发生变化。