Python代码报错TypeError: 'function' object is not subscriptable,求解决
解决Python密码管理器的TypeError问题
你遇到的TypeError: 'function' object is not subscriptable错误,核心是函数名与变量名冲突、变量作用域错误加上逻辑漏洞导致的,下面是具体问题分析和修复方案:
核心问题拆解
- 函数
passwords()和内部的列表变量passwords同名,导致在passview()里访问passwords[2]时,Python把passwords当成了函数而非列表,自然无法用下标访问。 - 存储密码的列表是
passwords()内部的局部变量,passview()根本拿不到这个数据。 - 原代码每次添加账号都会覆盖列表的三个元素,存不了多个账号;
passview()里还用到了未定义的account1变量,查找逻辑完全错误;而且passwords()的循环里每次都调用menu(),会导致流程混乱嵌套。
修复后的完整代码
# 全局变量存储所有账号信息,每个元素是[账号名, 用户名, 密码]的子列表 password_list = [] def menu(): while True: try: choice = int(input("Do you want to add a new account(1) or view an existing password (2)? ")) if choice == 1: add_password() elif choice == 2: view_password() else: print("请输入1或2") except ValueError: print("请输入有效的数字") def add_password(): while True: account = input("Enter the account name: ") username = input("Enter the Username: ") password = input("Enter the Password: ") # 将新账号添加到全局列表中 password_list.append([account, username, password]) answer = input("Would you like to enter another account? Y/N? ").upper() if answer == "N": break # 添加完成后返回菜单 menu() def view_password(): if not password_list: print("还没有存储任何账号信息") menu() return account = input("Which account would you like to find the password for? ") # 遍历列表查找匹配的账号 for item in password_list: if item[0] == account: print(f"The password is {item[2]}") menu() return print("未找到该账号的信息") menu() # 启动程序 menu()
关键修复点说明
- 重命名避免冲突:把原来的
passwords()函数改名为add_password(),存储数据的列表用password_list,彻底解决函数与变量同名的问题。 - 全局变量共享数据:将
password_list设为全局变量,让所有函数都能访问和修改存储的账号信息。 - 修正数据结构:每个账号作为一个子列表添加到
password_list中,支持存储多个账号,不会覆盖原有数据。 - 修复查找逻辑:
view_password()通过遍历列表匹配账号名,找到后输出对应的密码,同时增加了空列表的判断,避免无数据时报错。 - 优化流程控制:调整菜单和添加账号的循环逻辑,避免重复嵌套调用
menu(),让程序流程更清晰。
内容的提问来源于stack exchange,提问作者aperson
相关产品推荐
相关产品推荐

