我有下面的代码,由于某种原因 while 循环没有终止。
def iterator(i, f):
print len(f)
print i
while i < len(f):
if i == 0:
print "Restarted."
else:
print "iterate."
function()
return f
print 语句并不是真正必要的,但是计数器 i 被另一个函数增加了,所以我想确保这不是问题所在。对于包含 4 个项目的列表 f,它打印如下:
4, 0, Restarted.
4, 1, iterate.
4, 2, iterate.
4, 3, iterate.
4, 4, iterate.
4, 4, iterate.
etc..
我不明白为什么它在 i = 4 和 len(f) = 4 时一直进入 while 循环。它应该打破循环并执行返回函数,但由于某种原因它没有。
谁能解释为什么 while 循环在条件变为假时不会终止?
编辑:一些代码可以更好地解释正在发生的事情。我还阐明了 i 由 function() 更改,然后调用 iterator 增加了 i . 希望这是有道理的。
f = [0,1,2,3]
i = 0
def iterator(i, f):
print i
while i < len(f):
print i
if i == 0:
print "Restarted."
else:
print "iterate."
function(i, f)
return f
def function(i, f):
i += 1
iterator(i, f)
iterator(i,f)
结果是这样的:
0, 0, Restarted.
1, 1, iterate.
2, 2, iterate.
3, 3, iterate.
4, 3, iterate.
4, 3, iterate.
etc.
请您参考如下方法:
the counter i gets increased by another function
不可能。它是一个本地整数。打印的值是不同 变量的值。尝试在循环中添加 print i,您就会看到。
int 是一种不可变类型。这意味着这种类型的对象不能改变它的值。唯一可以改变的是某个变量持有的对象。
def inc(i):
i+=1
i=0
inc(i)
print i
输出:
0
这是为什么呢?因为 inc 里面的 i 和它外面的 i 是两个自变量。 inc 中的 i+=1 只表示“让局部变量 i 现在指向一个新对象,2 ”。它不会以任何方式影响全局 i。就像 C 和 Java(以及大多数其他主要语言的默认设置)一样,变量是按值传递的。
如果 function 从 f 中删除元素,则此循环可以结束的唯一方法,假设 f 是一个列表,因此是可变的。
这是与您的新版本等效的代码。请注意,您正在使用递归,而不仅仅是循环。你很快就会出栈:
f = [0,1,2,3]
i = 0
def iterator(i, f):
print i
while i < len(f):
'''if the recursion is less than 4 levels deep: loop forever
else: don't loop at all'''
print i
if i == 0:
print "Restarted."
else:
print "iterate."
iterator(i+1, f)
return f
输出:
0, 0, Restarted. # 0 level recursion, 1st iteration
1, 1, iterate. # 1 level recursion, 1st iteration
2, 2, iterate. # 2 level recursion, 1st iteration
3, 3, iterate. # 3 level recursion, 1st iteration
4, 3, iterate. # 3 level recursion, 2nd iteration, the condition now is false
4, 3, iterate. # 3 level recursion, 3rd iteration
4, 3, iterate. # 3 level recursion, 4th iteration
4, 3, iterate. # 3 level recursion, 5th iteration
等等。
