Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确保输入为整数时发生UnboundLocalError_Python_Python 3.x_User Input - Fatal编程技术网

Python 确保输入为整数时发生UnboundLocalError

Python 确保输入为整数时发生UnboundLocalError,python,python-3.x,user-input,Python,Python 3.x,User Input,如果我第一次输入一个有效的整数,一切正常,但是如果我首先输入一个字符串,“else”将执行,并再次得到提示,但是,当我实际输入一个整数时,我会得到UnboundLocalError。感谢您的帮助问题在于此函数是递归函数。第二次正确输入整数时,main的最内层实例将返回到main的外部实例,就在else块之后。接下来它要做的是print(num_players),它在内部实例中运行良好,但在外部实例中没有绑定 如果 注意,问题并不在于递归,如果删除对main的递归调用,它仍然会出错。递归只是意味着

如果我第一次输入一个有效的整数,一切正常,但是如果我首先输入一个字符串,“else”将执行,并再次得到提示,但是,当我实际输入一个整数时,我会得到UnboundLocalError。感谢您的帮助

问题在于此函数是递归函数。第二次正确输入整数时,
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)