今天我了解到 Python 会缓存表达式{}
,并在将其分配给变量时将其替换为新的空字典:
print id({})
# 40357936
print id({})
# 40357936
x = {}
print id(x)
# 40357936
print id({})
# 40356432
我还没有查看源代码,但我知道如何实现它。(也许当对全局的引用计数{}
增加时,全局{}
被替换。)
但考虑这一点:
def f(x):
x['a'] = 1
print(id(x), x)
print(id(x))
# 34076544
f({})
# (34076544, {'a': 1})
print(id({}), {})
# (34076544, {})
print(id({}))
# 34076544
f
修改全局字典而不导致它被替换,并打印出修改后的字典。但是在外部f
,尽管 id 相同,但全局字典现在是空的!
怎么了??