【问题标题】:Reassigning value of iterator while iterating through it在迭代时重新分配迭代器的值
【发布时间】:2019-04-06 12:56:00
【问题描述】:

首先免责声明

我不想使用这样的代码,我知道这是一种不好的做法。同样,我对如何改进它、使它正确的提示也不感兴趣。我感兴趣的是一个理论。

这样的代码如何在 python 3.6 中工作:

ls = range(5)
for elem_a in ls:

    ls = range(5, 10)
    for elem_b in ls:
        print(elem_a, elem_b)

我在迭代时重新分配 ls 的值。 for elem_a in ls第一次执行时,第一次迭代中ls的值是否存储在内存中?

【问题讨论】:

  • 对于外循环,ls 事先已经是range(5),无论它在循环内发生什么变化,它都会遍历这个可迭代对象。
  • 太好了,我是这么认为的。谢谢您的即时答复。

标签: python python-3.x loops iteration


【解决方案1】:

重新分配您正在循环的变量没有任何效果,因为每次迭代都不会重新评估该变量。事实上,循环内部循环的是 iterator,而不是 range 对象。

基本上如果你有这样的循环:

seq = range(5)
for elem in seq:
    seq = something_else

Python 将其重写为如下形式:

seq = range(5)

loop_iter = iter(seq)  # obtain an iterator
while True:
    try:
        elem = next(loop_iter)  # get the next element from the iterator
    except StopIteration:
        break  # the iterator is exhausted, end the loop

    # execute the loop body
    seq = something_else

这一点的关键在于循环有自己对存储在loop_iter 中的iter(seq) 的引用,因此自然地重新分配seq 对循环没有影响。

这一切都在compound statement documentation:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

表达式列表被计算一次;它应该产生一个可迭代的 目的。为expression_list 的结果创建一个迭代器。 然后,该套件为由提供的每个项目执行一次 迭代器,按照迭代器返回的顺序。

【讨论】:

  • 感谢您清晰而深入的解释。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 2015-01-25
  • 2014-10-14
  • 2019-04-19
  • 2012-03-23
  • 2015-01-01
  • 2013-11-02
  • 2021-02-11
相关资源
最近更新 更多