Python类型似乎是由后面的代码而不是当前类型决定的
我对我刚刚实现的Python代码感到困惑(为此进行了简化) 这段代码在第四行有一个bug-它应该是userInput=input() 但是,当代码运行时,它会立即在第二行出现错误,并显示消息“AttributeError:“builtin\u function\u或\u method”对象没有属性“lower” 我的理解是,此时用户输入的类型应该是字符串 修复第四行上的错误会使程序按预期运行-也就是说,它不再在第2行出错Python类型似乎是由后面的代码而不是当前类型决定的,python,types,Python,Types,我对我刚刚实现的Python代码感到困惑(为此进行了简化) 这段代码在第四行有一个bug-它应该是userInput=input() 但是,当代码运行时,它会立即在第二行出现错误,并显示消息“AttributeError:“builtin\u function\u或\u method”对象没有属性“lower” 我的理解是,此时用户输入的类型应该是字符串 修复第四行上的错误会使程序按预期运行-也就是说,它不再在第2行出错 在这里,我是否缺少一些明显的东西,或者在Python如何确定类型的过程中,
在这里,我是否缺少一些明显的东西,或者在Python如何确定类型的过程中,这是一些微妙的东西?Python版本是3.6.12。它太快了,你看不见
代码正在执行,当它进入类型已更改的第二次迭代时,将引发错误。您可能没有注意到您编写的消息是在出错之前打印的。在Python中,类型链接到对象本身,而不是名称。因此,当您键入
userInput=input
时,名称将重新分配给函数对象,stringvalue“invalid”不再相关。然后在第2行中,您尝试访问userInput.lower
,但是userInput
现在绑定到函数input
,并且input
没有名为lower
的属性,这会导致属性错误。在您执行代码后,您应该首先看到打印输出的“您想继续吗?(y/n)”然后抛出错误
第三行代码将userInput:str
类型重新分配给内置函数Input
我建议如下
userInput = 'invalid'
while userInput.lower() not in ['y', 'n']:
userInput = input('Do you want to continue? (y/n)')
print("My input is {}".format(userInput))
else:
print("finish input")
希望它能帮助你,谢谢 它不会立即出错。错误发生在第二个循环调用上。由于这个bug,循环在不等待用户输入的情况下连续运行,当然第二次调用发生得非常快。哦。。。当然我在拍脸。谢谢你发现了,我快疯了。谢谢。这应该教会我在早上喝咖啡之前不要在上面写问题。
userInput = 'invalid'
while userInput.lower() not in ['y', 'n']:
userInput = input('Do you want to continue? (y/n)')
print("My input is {}".format(userInput))
else:
print("finish input")