Python自定义rent方法传参报错、无参调用错误删除列表元素问题
问题原因解析
1. 传参触发TypeError的原因
你定义的rent是类的实例方法,声明的形参只有self(实例方法的self参数会在调用时自动传入,不需要手动传递),所以该方法实际只支持0个额外入参。你调用account.rent(2)时额外传入了数值2,参数数量不匹配,就会触发对应报错。
2. 无参调用误删除2个元素的原因
这是Python遍历列表时同步修改列表的经典问题:遍历过程中调用remove删除元素会导致列表长度动态缩短、索引整体前移,遍历逻辑会跳过部分元素。
你初始化的BookList初始为["Book n1", "Book n2", "Book n3"],执行逻辑如下:
- 第一轮遍历取索引0的元素
Book n1,删除后列表变为["Book n2", "Book n3"] - 第二轮遍历按顺序取索引1的元素,此时列表索引1对应的元素是
Book n3,删除后列表变为["Book n2"] - 第三轮遍历要取索引2的元素,当前列表长度仅为1,超出范围后循环终止
最终只留下Book n2,正好符合你观察到的「删除前2个元素」的现象。
修复方案
首先给rent方法新增要删除的书籍ID形参,删除逻辑改用pop按索引删除(避免遍历修改列表的问题),修改后的代码如下:
def rent(self, book_id): if self.logged: # 先校验ID合法性 if 0 <= book_id < len(lib.bib.BookList): lib.bib.BookList.pop(book_id) else: print("指定的书籍ID不存在") else: print("No Access")
修改后调用account.rent(2)即可正常删除对应ID的书籍。
内容的提问来源于stack exchange,提问作者NIKEN
相关产品推荐
相关产品推荐

