【问题标题】:Can someone explain the behaviour of empty dicts in python generator expressions? [duplicate]有人可以解释 python 生成器表达式中空字典的行为吗? [复制]
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这正是我错过的——使用生成器,我失去了对项目的引用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2013-11-30
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多