f 字符串会改变其中插入的值吗?

问题描述 投票:0回答:1

此代码打印 ab 的值,同时两者都引用包装器 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

我将 ab 的值插入到 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

为什么?

python f-string objectid
1个回答
0
投票

在第一个代码块中,您会看到相同的 id,因为 Python 做了一些低级优化。 当

b = id(my_decorator(some_func))
执行后立即执行
a = id(my_decorator(some_func))
时,第一次调用时
my_decorator
返回的对象仍然在内存中,没有被垃圾回收。因此,当您第二次调用
my_decorator
时,会引用内存中的同一对象,因此您会看到相同的对象 ID。

在第二个使用 f 字符串的示例中,它不必生成不同的对象。这取决于第二次调用时对象是否被垃圾收集。如果使用 f 字符串进行第二次调用时该对象仍然存在于内存中,则它仍将引用与第一次调用中相同的对象并打印相同的 ID。 例子:

您的实现永远不应该依赖于语言所做的低级优化。这些优化往往会在未来的版本中发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.