问题描述
关于2。
实际上,我们必须区分两种情况。
记得格雷格·休吉尔(Greg Hewgill)写道:
“迭代器”是负责创建元素序列的单个对象。此序列可能是现有列表的元素,也可能是已计算的内容,例如质数或π的十进制数字。
:
迭代器计算刺激时必须产生的对象;也就是说,在调用之前不存在产生的对象next()
。因此,如果为该对象分配了名称,则该对象将保留下来。如果不存在,则该对象将在一定时间内不绑定到名称空间中的名称而存在,然后它将在内存中消失,也就是说,它占用的位将在以后或早用于另一个对象。
是当迭代器返回属于列表,元组,字典等的先前存在的对象时。在这种情况下,由a产生的每个对象next()
已经具有名称的绑定。然后,如果在对象“弹出”到迭代器时为其分配了新名称,则将有两个名称绑定到该对象。而且,如果未将对象分配给名称,则它将继续仅绑定到一个名称,这足以使对象保持活动状态。
每次通过迭代器的调用生成对象时,如果没有为其分配名称,则操作的唯一结果是迭代器已被“消耗”。用这种方式可以说,即使在生成对象之后没有永久性后果,它也会发生使迭代器内部发生跟踪的事情。
有人谈到在给对象分配名称时也消耗了迭代器,但是,我不想混淆。
实际上,如果某个对象预先存在于列表中,则可能是它没有名称。但是列表包含它“包含”的每个对象的引用…实际上,列表并不“包含”对象,而仅引用对象…远远超出了我想说的范围。
。
关于3
您不应该编写3: “将变量分配给…时”
变量 一词在Python中是一个陷阱,因为它含义不明确。从其他语言的常识来看,Python中没有 变量 ,也就是说, 只有对象。 这个词通常被用来表示一个 标识符 。因此,将其称为“ 标识符 ”或“名称” 是一种更好的做法。这避免了混乱。
。
关于4
我认为仅一次调用就不可能从迭代器中获得两次收益 next()
解决方法
我已经在Python中工作了几个月,但我突然发现,我常常忽略了乍看之下能逃避我的词汇,而是试图去了解一个主旨。现在,回顾过去,我仍然发现自己对“ 消费”
一词感到困惑。我最初的兴趣来自对迭代器的解释,该解释谈到了迭代器的价值正在被消耗。但是,环顾四周,这似乎在Python词典中并不常见。还是?在这里四处浏览可以找到大多数对Web服务的引用,以及一两次关于如何隐藏函数结果的讨论。
我想然后将我的无知分解为几个基本点:
- “消费”是否在不同的Python上下文中做不同的事情?
- 数据在被使用时(例如in)会发生
iter()
什么变化? - 将变量分配给迭代器的结果(据称是消耗的数据)时,它不再属于迭代器吗?
- 您可以在一次对迭代器的调用中消耗一个迭代器对象的多个值吗?
我希望这有一定道理。请注意,这并不是针对任何特殊需求。我只是在合理性之外感到困惑。
编辑:还有一件事…迭代值(用调用时next()
)是否保留在内存中?