Skip to main content
 首页 » 编程设计

python之Python 中的 while 循环终止

2025年05月04日10kenshinobiy

我有下面的代码,由于某种原因 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  

等等。