You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:39:43