我注意到在Python中可以使用for循环来模拟while循环(我对编码知之甚少)。然后我尝试使用两种不同的配方构建两个相同的while循环。在我看来,这就是这种情况(是吗?)
# for-loop formulation
index = [0]
for a in index:
if a < 6:
index.append(a + 1)
# while-loop formulation
index = [0]
while index[-1] < 6:
index.append(index[-1] + 1)
让我感到困惑的是,我认为一旦列表索引被更新/更改,for-loop将从头开始重新启动,因为列表可能在任何周期都发生了显着变化。例如,如果你运行
#3
index = [0]
for a in index:
print a
if a < 6:
index.append(a+1)
if a > 3:
index = [1, 3]
print index
你得到了输出
0
[0, 1]
1
[0, 1, 2]
2
[0, 1, 2, 3]
3
[0, 1, 2, 3, 4]
4
[1, 3]
5
[1, 3]
其中a不是最后一步中新索引[1,3]的一部分。 因此有三个问题:
答案 0 :(得分:1)
前两个基本相同,因为它们将在各种情况下运行相同数量的迭代,并使index
处于相同状态。如果您将index.append(a+1)
替换为index.append(a)
,则for
循环将永久运行;同样,如果您将index.append(index[-1] + 1)
替换为index.append(index[-1])
,则while
循环将永久运行。修改一个你正在迭代的列表有点令人讨厌,但它有时是一种合理的策略。
顺便说一下,for
循环发生了什么,当你启动它时,会创建一个迭代器,它提供index[0]
,然后是index[1]
,然后是index[2]
等等,直到它到达不存在的index[N]
。这个迭代器不知道或不关心您是否正在更改列表,因此如果您使列表更长,它将会更快地继续下去。
在程序#3中,存在一些范围混淆。进入for循环时创建的迭代器并不关心你是否在for循环中重新分配变量index
:它只是继续迭代原始列表。前几次执行index.append(a+1)
时,确实会影响原始列表;但是只要你index = [1, 3]
index
,5
就不再引用原始列表了,所以你对它做的任何事都都不会影响剩余的迭代过程。添加的最后一个值是a
,因为一旦4
到达a+1
并且index
被附加到索引,index
就会遭到破坏,并且不会再附加任何内容到原始列表。
最后,[1, 3]
的破坏在for循环之外持续存在:循环完成后它将具有值$.ajax({
type: 'POST',
url: 'echodata.php',
data: form_data,
dataType:"json",
success: function(data){
$('#table').append('<tr><td>'+data.agent_name+'</td>' // + more columns ...
+'</tr>');}
);
。