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

Python电话簿脚本调用addcontact函数触发NameError错误如何解决

错误原因

你触发NameError的核心原因是函数作用域和定义时机的问题:
addcontact()是嵌套定义在menu()函数内selection == 2的分支下的,只有当你实际选择了菜单第2项(添加联系人)时,这个函数才会被Python解释器创建生效。当你直接选择第4项进入编辑逻辑时,selection == 2的分支从未执行过,addcontact()函数根本没有被定义,所以调用时会报找不到变量的错误。

其他隐藏问题
  • 你所有功能执行完都递归调用menu(),长时间使用会触发递归深度超限的栈溢出错误,不建议用递归实现菜单循环,改用while True死循环更合理。
  • 功能函数嵌套在菜单分支里的写法可维护性极低,也容易触发作用域问题。
修复方案
  1. 把所有功能函数(addcontact、search_and_edit等)从menu()的分支逻辑中挪到全局作用域,或者menu()函数的最开头,不要放在条件判断分支内。
  2. 把菜单的递归调用改为循环实现。

修复后的参考代码:

# 全局电话簿变量
phonebook = {}

def addcontact():
    first = str(input("First name: "))
    last = str(input("Last name: "))
    num = str(input("Number? "))
    phonebook.update({last + " " + first: num})
    input("Contact saved, press Enter to continue.")

def search_and_edit():
    search = str(input("Please type the exact name of the contact you are looking for: "))
    if search in phonebook:
        print("Name: ", search, "Number: ", phonebook[search])
        edit = str(input("Do you wish to edit this contact? Y/N"))
        if edit.lower() == "y":
            phonebook.pop(search)
            addcontact()
    else:
        print("Contact not found.")
    input("Press Enter to continue.")

def menu():
    while True:
        selection = int(input("""1:View phonebook
2:Add contact
3:Delete contact
4:Search for a contact and if necessary edit it
5:Save and Exit

What would you like to to?"""))
        if selection == 1:
            if len(phonebook)== 0:
                print("Phonebook is empty, please add a contact first.")
                input("Press Enter to continue ...")
            else:
                print(phonebook)
                input("Press Enter to continue ...")
        elif selection == 2:
            addcontact()
        elif selection == 4:
            search_and_edit()
        elif selection == 5:
            # 可自行补充保存到本地文件的逻辑
            print("Saved, exiting.")
            break

if __name__ == "__main__":
    menu()

内容的提问来源于stack exchange,提问作者Giorgos_Vr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:21:00