在迭代迭代器时重新分配迭代器的值

mdp*_*dpt 3 python iteration loops python-3.x

首先是免责声明:

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

为什么这样的代码在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)
Run Code Online (Sandbox Code Playgroud)

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

Ara*_*Fey 6

重新分配您正在循环的变量没有任何效果,因为不会为每次迭代重新评估变量.实际上,循环内部循环遍历迭代器,而不是遍历range对象.

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

seq = range(5)
for elem in seq:
    seq = something_else
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这个的关键方面是循环有自己的iter(seq)存储引用loop_iter,所以自然重新分配seq对循环没有影响.

所有这些都在复合语句文档中解释:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]
Run Code Online (Sandbox Code Playgroud)

表达式列表评估一次; 它应该产生一个可迭代的对象.为结果创建一个迭代器expression_list.然后,按迭代器返回的顺序,对迭代器提供的每个项执行一次该套件.