有人可以解释 python 生成器表达式中空字典的行为吗?

Can someone explain the behaviour of empty dicts in python generator expressions?

当我们偶然发现以下行为时,我和一些朋友在 Python 中讨论与内存管理相关的事情:

In [46]: l = ({} for _ in range(6))

In [47]: [ id(i) for i in l]
Out[47]:
[4371243648, # A
 4371245048, # B
 4371243648, # A
 4371245048, # B
 4371243648, # etc.
 4371245048]

这里令人惊讶的是我们似乎没有明确定义的行为:dict 既不是每次都是新的,也不是每次都是相同的引用。

最重要的是,我们得到了这种奇怪的行为(这两个片段之间的解释器中没有代码 运行)。

In [48]: m = ({} for _ in range(6))

In [49]: [ id(i) for i in m]
Out[49]:
[4371154376, # C
 4371245048, # B (same B as above!)
 4371154376, # C
 4371245048, # B
 4371154376,
 4371245048]

任何人都可以解释这种行为吗?使用列表理解 (l = [{} for _ in range(6)]) 显示每个字典的不同地址。

字典一旦不再被生成器引用,就会被销毁。您正在比较死对象的 ID,ID 可以重复使用。