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

Python中如何删除带有多个构造参数的自定义类实例对象

问题根因

你的删除逻辑存在两个核心错误:

  • list.remove() 方法要求传入的是列表中已存在的实例对象,你调用 item(remove) 是临时新建了一个完全独立的新对象,哪怕属性完全相同,两个对象的内存地址也不一样,默认规则下无法匹配到列表里的原有元素
  • 你引导用户输入的是元素的下标索引,直接按索引删除即可,不需要构建新对象匹配;另外 input() 返回的是字符串类型,需要先转为整数才能作为下标使用
  • 额外提示:不要用 list 作为变量名,这是Python的内置类型关键字,后续容易触发未知报错
修复方案

1. 最简修复(直接按下标删除)

仅修改remove_Item函数即可正常运行:

def remove_Item():
    print("索引从0开始递增,第一个物品对应索引0")
    remove_idx = input("请输入要删除的物品对应的索引: \n")
    print(f'你输入的索引是 {remove_idx}')
    # 转整数后用pop方法按下标删除,也可以替换为 del list[int(remove_idx)]
    list.pop(int(remove_idx))

2. 优化版(可选,提升使用体验)

可以给item类加__repr__方法,打印列表时更易读,同时替换掉保留字变量名:

# 修复类定义,类名推荐用大驼峰格式
class Item:
    def __init__(self, name, quantity, inv_date):
        self.name       = name
        self.quantity   = quantity
        self.inv_date   = inv_date
    # 自定义打印格式
    def __repr__(self):
        return f"Item(name='{self.name}', quantity={self.quantity}, inv_date={self.inv_date})"

# 变量名不要用list,改为语义更清晰的inventory
inventory = []
# 后续添加元素、遍历、增删操作都改用inventory操作即可

如果你确实需要按物品名称删除而不是按索引删除,也可以直接遍历列表匹配属性实现:

def remove_Item_by_name():
    remove_name = input("请输入要删除的物品名称: \n")
    # 遍历找到对应元素删除
    for item in inventory:
        if item.name == remove_name:
            inventory.remove(item)
            print(f"已删除物品{remove_name}")
            break
    else:
        print("未找到对应名称的物品")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:03