Python中嵌套While循环问题:内层循环仅首次执行
解决嵌套While循环内层仅执行一次的问题
嘿,我猜你大概率是把内层循环的变量初始化放在外层循环外面了!这是初学者很容易踩的坑,咱们一步步来看。
先还原一下你可能写的错误代码:
items = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['O', 'O', 'O', 'O', 'O', '.'], ['.', 'O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['.', '.', '.', '.', '.', '.']] e = 0 i = 0 # 问题出在这儿!i被定义在外层循环外面了 while e < len(items): while i < len(items[e]): print(items[e][i], end='') i += 1 print() e += 1
问题原因
第一次外层循环(e=0)时,i从0开始,一直加到6(因为每个子列表长度是6),此时内层循环结束。当e自增到1后,i已经是6了,而len(items[1])也是6,i < len(items[e])的条件不成立,内层循环直接跳过。后面的e值都会遇到同样的情况,所以只有第一行能打印出来。
修复方案
把内层循环的变量i的初始化移到外层循环里面,每次外层循环处理新的一行时,都重置i为0:
items = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['O', 'O', 'O', 'O', 'O', '.'], ['.', 'O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['.', '.', '.', '.', '.', '.']] e = 0 while e < len(items): i = 0 # 每次外层循环都重置i while i < len(items[e]): print(items[e][i], end='') i += 1 print() e += 1
这样每次处理新的一行时,i都会从0开始遍历当前行的所有元素,就能正常打印出所有行的图案了。
更Pythonic的写法
其实在Python里,遍历列表用for循环会更直观,代码也更简洁,完全可以替代嵌套while:
for row in items: for char in row: print(char, end='') print()
甚至可以用一行代码搞定:
print('\n'.join(''.join(row) for row in items))
内容的提问来源于stack exchange,提问作者Iris
相关产品推荐
相关产品推荐

