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?
重新分配您正在循环的变量没有任何效果,因为不会为每次迭代重新评估变量.实际上,循环内部循环遍历迭代器,而不是遍历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对循环没有影响.
所有这些都在复合语句文档中解释:
Run Code Online (Sandbox Code Playgroud)for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite]表达式列表评估一次; 它应该产生一个可迭代的对象.为结果创建一个迭代器
expression_list.然后,按迭代器返回的顺序,对迭代器提供的每个项执行一次该套件.