Python中的while循环无法退出

3

我现在正在尝试自学Python,使用“Learn Python The Hard Way”中的练习。

目前,我正在做一个关于while循环的练习,其中我要从脚本中获取一个有效的while循环,将其转换为函数,然后在另一个脚本中调用该函数。最终程序的唯一目的是将项目添加到列表中,并在进行时打印列表。

我的问题是,一旦调用函数,嵌入式循环就会无限继续。

我已经多次分析了我的代码(如下所示),但没有发现明显的错误。

def append_numbers(counter):
    i = 0
    numbers = []

    while i < counter:
        print "At the top i is %d" % i
        numbers.append(i)

        i += 1
        print "Numbers now: ", numbers
        print "At the bottom i is %d" % i

count = raw_input("Enter number of cycles: ")

print count
raw_input()

append_numbers(count)
4个回答

15

我相信你想要这个。

count = int(raw_input("Enter number of cycles: "))
不将输入转换为整数,你最终会得到一个字符串类型的变量 count。例如,如果你在程序要求输入时输入了 1,那么进入变量 count 的是字符串 '1'
字符串和整数进行比较结果为False。因此,while i < counter:中的条件始终为False,因为i是整数,而counter是字符串类型的变量。
如果你在程序中使用 print repr(count) 而不是 print count,就可以自己找出问题所在。对于你的程序,当你输入 1 时,它将显示 '1'。而如果按照我建议的修改,它将只显示数字 1

1

将输入的字符串转换为整数... count = int(count)


-1
以上已经清楚了为什么while循环会永远执行。它一直在循环大量的ASCII代码(非常庞大)。
但是要修复while循环,您可以简单地:
while i<int(counter):
    print "At the top i is %d" % i
    numbers.append(i)

-4

raw_input返回一个字符串,但i是一个整数。尝试使用input而不是raw_input


4
“input” 相当于 “eval(raw_input(prompt))”,而 “eval” 是有害的,请勿使用。 - Karoly Horvath
这只适用于Python 3,在那里他们摆脱了raw_input关键字。 - Joel Cornett
5
你在开玩笑吧?这里绝对存在安全风险。完全有可能生成一个字符串,当进行 eval() 评估后,会下载并运行特洛伊木马。 - Karl Knechtel
没有安全风险,因为除非在某些疯狂的实现中,该脚本直接连接到网络,否则用户是自己运行脚本并可能更直接地执行其“邪恶”命令。不要盲目坚持原则。 - comex
@comex即使在设置了setuid位的常见实现中,这也是一种安全风险。不要盲目地假设用户自己运行脚本。该脚本不需要连接到网络。即使以较低权限执行脚本的用户,具有设置setuid位的程序也可能导致特权升级。如果他必须遵循您的解决方案,则可以输入任何有效的Python语句到raw_input并通过此脚本以更高的特权执行它。换句话说,您提供了一个可怕的解决方案,任何注重安全的程序员都知道应该避免。 - Susam Pal
显示剩余2条评论

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