今天我了解到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是相同的,全球字典现在是空的!
怎么了??
它没有被缓存 - 如果你没有在{}任何地方分配结果,它的引用计数是0并且它立即被清除.碰巧你分配的下一个重用了旧的内存.当您将其分配给x您时,请将其保持活动状态,然后下一个具有不同的地址.
在你的函数示例中,一旦f返回,就没有对你的dict的剩余引用,所以它也会被清理掉,同样适用.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |