【发布时间】:2015-05-12 02:25:15
【问题描述】:
当我们偶然发现以下行为时,我和一些朋友正在讨论与 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]
这里令人惊讶的是,我们似乎没有明确定义的行为:字典既不是每次都是新的,也不是每次都相同的引用。
最重要的是,我们得到了这种奇怪的行为(没有代码在这两个 sn-ps 之间的解释器中运行)。
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)]) 会为每个 dict 显示不同的地址。
【问题讨论】:
-
This question 可能会让您对正在发生的事情有一个很好的了解
-
你读过
id()function documentation吗?你错过了一些重要的东西。 -
@MartijnPieters 我对
id()重复使用相同的号码并不感到惊讶。我对它重复使用相同数字的面孔感到惊讶而我保留对它的引用(这是我的谬误)。 -
@sitaktif:对,您没有保留对您生成的
{}对象的任何引用;生成器生成它们,但之后不引用它们。 -
@sitaktif:我认为你在这里出错了:dict 每次都不是新的,也不是每次都相同的引用。每次是一个新的dict;生成器表达式中的左侧表达式每次迭代都会重新计算。
标签: python dictionary generator-expression