为什么只有这些嵌套的while循环中最内层的循环在工作?

3

我是Python的初学者。 我有这段简单的代码:

a = 0
b = 0
c = 0

while a <= 5:
    while b <=3:
        while c <= 8:
            print a , b , c
            c += 1
        b += 1
    a += 1

只有在使用C语言时才工作

0 0 0
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8

为什么会出现这种情况?如何解决? 谢谢!

4
这不是在Python中编写循环的正确方式。使用for a in range(6) - georg
@Ignacio 不确定这个标题有什么意义? - agf
@agf:它只在第一次起作用。之后就没有反应了。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams 这就是答案。问题是为什么只有“c”循环在工作(或看起来在工作)——最内层的循环。 - agf
4个回答

7

第一种方法

您的方法可以奏效,但是每次迭代时必须记得重置循环计数器。

a = 0
b = 0
c = 0

while a <= 5:
    while b <=3:
        while c <= 8:
            print a , b , c
            c += 1
        b += 1
        c = 0 # reset
    a += 1
    b = 0 # reset
    c = 0 # reset

第二种方式(Pythonic)

第一种方式涉及大量的繁琐工作。在Python中,指定一个数字范围的循环更简单的方法是使用for循环和xrange*迭代器:

for a in xrange(5+1): # Note xrange(n) produces 0,1,2...(n-1) and does not include n.
    for b in xrange (3+1):
        for c in xrange (8+1):
            print a,b,c
  • 注意:在Python 3中,“xrange”现在被称为“range”。(更准确地说,Python 3的range替换了Python 2.x的rangexrange。)

第三种方法(最佳)

第二种方法可以通过应用itertools.product()来简化,该方法接受多个可迭代对象(列表)并返回每个列表中每个元素的所有可能组合。

import itertools
for a,b,c in itertools.product(xrange(5+1),xrange(3+1),xrange(8+1)):
    print a,b,c

想了解这些技巧以及更多内容,请阅读丹·古德格(Dan Goodger)的《像Python专家一样编写代码:Python习惯用法》


值得注意的是,“xrange()”是Python 3.x之前的内置函数,在此之后,只需使用“range()”。虽然由于使用了“print”语法,很明显OP正在使用Python 2.x,但对于其他人来说,提到这一点仍然是一个好主意。 - Gareth Latty
@Lattyware:没错。我会让你的评论作为 Py3k 用户的通知。 ;) - Li-aung Yip
我还会提出一点看法,即在每个“while”循环之前重置变量,以避免在开始时和每个循环结束后重新设置变量 - 这并不是很重要,但我认为这样阅读更清晰,代码也更少。显然,以上所说的后一种解决方案是最佳选择。 - Gareth Latty
请注意它们的条件是 <=,因此您实际上需要使用 range(6),而不是 (5)。 - georg
2
总是你们这些人的挑剔,是吗?!:)(已编辑) - Li-aung Yip
1
不需要在你的第一个解决方案中两次重置 c - Tim Pietzcker

6

你忘记在循环的顶部重置 bc,这就是为什么我们使用 for 循环的原因。


2

c <= 8 循环时,c 逐渐增加并最终到达 8,因此程序不必再次执行该循环。

尝试在循环结束时设置 c = 0,并在它们的循环后将 ba 设为 0,或者更好地利用 itertools 或 for 循环。


0
第一个while循环结束后,c将等于9。你从未重置c,所以在a或b循环中,c <= 8永远不会成立。
如果在它们的循环之前重置每个变量,它将正常工作。
a = 0
while a <= 5:
    b = 0
    while b <=3:
        c = 0
        while c <= 8:
            print a , b , c
            c += 1
        b += 1
    a += 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接