Python 确保输入为整数时发生UnboundLocalError
如果我第一次输入一个有效的整数,一切正常,但是如果我首先输入一个字符串,“else”将执行,并再次得到提示,但是,当我实际输入一个整数时,我会得到UnboundLocalError。感谢您的帮助问题在于此函数是递归函数。第二次正确输入整数时,Python 确保输入为整数时发生UnboundLocalError,python,python-3.x,user-input,Python,Python 3.x,User Input,如果我第一次输入一个有效的整数,一切正常,但是如果我首先输入一个字符串,“else”将执行,并再次得到提示,但是,当我实际输入一个整数时,我会得到UnboundLocalError。感谢您的帮助问题在于此函数是递归函数。第二次正确输入整数时,main的最内层实例将返回到main的外部实例,就在else块之后。接下来它要做的是print(num_players),它在内部实例中运行良好,但在外部实例中没有绑定 如果 注意,问题并不在于递归,如果删除对main的递归调用,它仍然会出错。递归只是意味着
main
的最内层实例将返回到main
的外部实例,就在else
块之后。接下来它要做的是print(num_players)
,它在内部实例中运行良好,但在外部实例中没有绑定
如果
注意,问题并不在于递归,如果删除对
main
的递归调用,它仍然会出错。递归只是意味着您在最终输入整数之前不会看到错误您根本不应该对此使用递归
def main():
prompt = input('How many players? ')
if prompt.isdigit():
num_players = int(prompt)
else:
print('Invalid input!')
main()
print(num_players)
main()
没有理由使用isdigit
和int
;您永远不会使用int
值,因为print
会立即将其再次转换为str
但是,您可以使用int
而不是isdigit
(特别是如果计划稍后使用int
值,而不仅仅是打印它
def main():
while True:
prompt = input('How many players? ')
if prompt.isdigit():
break
print('Invalid input!')
print(num_players)
在输入无效的情况下,您再次调用了
main()
,并且在该函数的实例中,您确实为局部变量num\u players
赋值。但是您从未在main()的原始实例中设置该变量
,因此在尝试打印时会出现错误。您确实希望在此处使用while
循环,而不是递归,以重复用户输入直到其有效。我应该提到,我在此处发布的代码是实际代码的简化版本,我实际使用了num_players变量。原因是我没有像您的第二个版本是因为我不希望用户输入像3.5这样的浮点值。另外,我想尽量减少检查次数,并试图避免使用try:except部分和isdigit()部分。我最后做了如下操作:如果提示不在[str(I+1)中,则提示范围(9)中的I),它之所以有效,是因为在原始问题中给了我一个上限。int(“3.5”)
将引发异常,而不是像int(3.5)
那样解析浮点然后截断。
def main():
while True:
prompt = input('How many players? ')
try:
num_players = int(prompt)
break
except ValueError:
pass
print(num_players)