Skip to main content
 首页 » 编程设计

python之循环内的副作用会影响它的生成器吗

2025年05月04日16Leo_wl

在 Python v2.7 中,我在 for 生成器上遇到了一个 for 语句,其中在循环主体中的项目是 for 生成器有副作用:

for ssid in (ssid for ssid in overlaps if ssid != subseq_id): 
  overlaps = subseq_id_to_overlap_ssids_dict[ssid] 

我的问题是重叠的副作用是否应该影响 for 生成器?我希望不是,但如果是这样,那到底是什么意思?如果我处理了第一个匹配元素并现在替换了 overlaps,for 是否会索引到 overlaps 的新值的下一个位置?

请您参考如下方法:

在循环内重新绑定(bind) overlaps 不会对循环产生任何影响(尽管改变它显然会)。在循环中重新绑定(bind) subseq_iq 可能会影响生成器。

for 循环在循环开始时计算表达式以获取迭代器一次:在这种情况下,表达式只是名称 overlaps。一旦它评估了该表达式,它就会从可迭代对象中创建一个迭代器,并使用该迭代器来遍历元素。迭代器取决于表达式返回的对象,它不取决于用于标识该对象的名称(如果确实有任何名称)。

如果是这种特殊情况,代码完全等同于:

for ssid in overlaps: 
  if ssid != subseq_id: 
     overlaps = subseq_id_to_overlap_ssids_dict[ssid] 

这是一种更清晰的编写方式,但是重新绑定(bind) overlaps 不会改变 for 使用的序列。