Python for循环结合break、else使用时触发NameError报错
报错原因
- 核心问题是代码错误使用
eval()包裹input()方法:Python3中input()会直接将用户输入读取为字符串类型,当你输入Tim时,原生input()返回的就是字符串值"Tim";外层嵌套eval()后,解释器会把输入内容当做Python表达式执行,裸写的Tim会被识别为变量名,而当前代码作用域中没有定义名为Tim的变量,因此触发NameError。 - 原代码还存在不规范写法:用Python内置类型名
list作为自定义变量名,会覆盖内置list类的引用,可能引发其他隐性问题。 - 补充说明:这个笔误大概率是作者混淆了Python2与Python3的输入API:Python2版本的
input()自带eval解析逻辑,读取纯字符串需要调用raw_input(),Python3则将raw_input()重命名为input(),移除了默认的eval行为。
修复方案
移除input()外层多余的eval()调用,同时替换掉覆盖内置类型的变量名即可,修复后可运行代码如下:
name_list = ['Jack', 'Jill', 'Tim', 'Dave'] name = input('Type a name: ') for i in range(len(name_list)): if name_list[i] == name: print(name, 'is number', i + 1, 'on the list') break else: print(name, 'is not on the list')
修复后运行无需给输入的姓名加引号,直接输入名称即可得到正确匹配结果,不会再触发名称错误。
内容的提问来源于stack exchange,提问作者David Escudero
相关产品推荐
相关产品推荐

