如何解决Python报错NameError: name 'pr' is not defined
报错根因分析
触发NameError: name 'pr' is not defined的核心原因是Python缩进错误,同时代码中还存在4处会导致程序运行异常的问题,具体如下:
- 缩进错误:定义
showmenu()函数时,仅菜单字符串pr的赋值语句被缩进纳入函数体,后续两层while True的交互逻辑全部处于全局作用域。pr是showmenu()内部的局部变量,全局作用域无访问权限,直接触发名称未定义错误。 - 方法调用符号错误:
pushit()函数中写为stack:append(),Python中调用对象方法需要用点.连接,冒号是类型标注语法,此处会触发属性错误。 - 栈弹出逻辑错误:
popit()函数中print语句内的stack.pop()被引号包裹为字符串字面量,既不会执行弹出栈顶元素的操作,也无法拿到实际弹出的值。 - 入口判断变量错误:程序入口判断处写为单下划线包裹的
_name_、_main_,Python内置的特殊变量为双下划线包裹的__name__、__main__,写法错误会导致入口判断永远不生效。 - 退出逻辑位置错误:判断用户输入
q退出的分支写在内层循环break语句之后,永远不会被执行,用户选q时无法正常退出程序,还会触发字典键不存在的报错。
修复后完整代码
stack = [] def pushit(): stack.append(input(' Enter New String: ').strip()) def popit(): if len(stack) == 0: print('Cannot pop from an empty stack!') else: pop_val = stack.pop() print(f'Removes [{pop_val}]') def viewstack(): print(stack) CMDs = {'u': pushit, 'o': popit, 'v': viewstack} def showmenu(): pr = ''' p(U)sh p(O)p (V)iew (Q)uit Enter choice:''' while True: try: choice = input(pr).strip()[0].lower() except (EOFError, KeyboardInterrupt, IndexError): choice = 'q' print('\nYou picked:[%s]' % choice) if choice not in 'uovq': print('Invalid option,try again') continue if choice == 'q': break CMDs[choice]() if __name__ == '__main__': showmenu()
修复说明
- 将
showmenu()函数下所有交互逻辑统一缩进,纳入函数作用域,解决pr变量无法访问的问题 - 将
stack:append修正为stack.append,保证入栈方法正常调用 - 调整
popit()逻辑,实际执行pop操作拿到弹出值后打印,避免打印固定字符串 - 修正入口判断的特殊变量为双下划线写法,保证程序入口正常触发
- 调整q选项的判断位置,输入q时可正常退出循环,无效输入时用
continue跳过后续逻辑,交互逻辑顺畅
内容的提问来源于stack exchange,提问作者OliverYeung
相关产品推荐
相关产品推荐

