与"{}"的明显缓存相关的奇怪行为

val*_*ron 5 python

今天我了解到Python缓存了表达式{},并在分配给变量时将其替换为新的空字典:

print id({})
# 40357936

print id({})
# 40357936

x = {}
print id(x)
# 40357936

print id({})
# 40356432
Run Code Online (Sandbox Code Playgroud)

我没有查看源代码,但我知道如何实现它.(可能当全局的引用计数{}递增时,全局{}会被替换.)

但请考虑一下:

def f(x):
    x['a'] = 1
    print(id(x), x)

print(id(x))
# 34076544

f({})
# (34076544, {'a': 1})

print(id({}), {})
# (34076544, {})

print(id({}))
# 34076544
Run Code Online (Sandbox Code Playgroud)

f修改全局字典而不使其被替换,并打印出修改后的字典.但除此之外f,尽管id是相同的,全球字典现在是空的!

怎么了??

Fat*_*ror 6

它没有被缓存 - 如果你没有在{}任何地方分配结果,它的引用计数是0并且它立即被清除.碰巧你分配的下一个重用了旧的内存.当您将其分配给x您时,请将其保持活动状态,然后下一个具有不同的地址.

在你的函数示例中,一旦f返回,就没有对你的dict的剩余引用,所以它也会被清理掉,同样适用.