Python电话簿脚本调用addcontact函数触发NameError错误如何解决
错误原因
你触发NameError的核心原因是函数作用域和定义时机的问题:addcontact()是嵌套定义在menu()函数内selection == 2的分支下的,只有当你实际选择了菜单第2项(添加联系人)时,这个函数才会被Python解释器创建生效。当你直接选择第4项进入编辑逻辑时,selection == 2的分支从未执行过,addcontact()函数根本没有被定义,所以调用时会报找不到变量的错误。
其他隐藏问题
- 你所有功能执行完都递归调用
menu(),长时间使用会触发递归深度超限的栈溢出错误,不建议用递归实现菜单循环,改用while True死循环更合理。 - 功能函数嵌套在菜单分支里的写法可维护性极低,也容易触发作用域问题。
修复方案
- 把所有功能函数(
addcontact、search_and_edit等)从menu()的分支逻辑中挪到全局作用域,或者menu()函数的最开头,不要放在条件判断分支内。 - 把菜单的递归调用改为循环实现。
修复后的参考代码:
# 全局电话簿变量 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
相关产品推荐
相关产品推荐

