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

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()

关键修复点说明

  1. 重命名避免冲突:把原来的passwords()函数改名为add_password(),存储数据的列表用password_list,彻底解决函数与变量同名的问题。
  2. 全局变量共享数据:将password_list设为全局变量,让所有函数都能访问和修改存储的账号信息。
  3. 修正数据结构:每个账号作为一个子列表添加到password_list中,支持存储多个账号,不会覆盖原有数据。
  4. 修复查找逻辑:view_password()通过遍历列表匹配账号名,找到后输出对应的密码,同时增加了空列表的判断,避免无数据时报错。
  5. 优化流程控制:调整菜单和添加账号的循环逻辑,避免重复嵌套调用menu(),让程序流程更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:47:28