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

修复TypeError错误:不修改my_list['push_first'](x)解决函数不可下标问题

修复方案:让make_mutable_rlist支持下标式方法调用

错误本质是当前make_mutable_rlist返回的是普通函数,而函数不支持[]下标访问。要保留my_list['push_first'](x)的写法,需让返回对象实现__getitem__方法,通过该方法映射方法名到对应的操作逻辑。以下是两种可行修复方案:

方案1:基于类实现

用类封装递归列表的状态与方法,通过__getitem__映射方法名:

class MutableRList:
    def __init__(self):
        self.first = None
        self.rest = None

    def push_first(self, x):
        # 此处替换为你原有的push_first逻辑
        old_first = self.first
        self.first = x
        if self.rest is None:
            self.rest = MutableRList()

    def __getitem__(self, method_name):
        if method_name == 'push_first':
            return self.push_first
        # 可添加其他方法的映射,如'pop_first'等
        raise KeyError(f"Method '{method_name}' not found")

def make_mutable_rlist():
    return MutableRList()

方案2:闭包+自定义对象(无类实现)

通过闭包维护状态,给返回对象绑定__getitem__方法:

import types

def make_mutable_rlist():
    first = None
    rest = None

    def push_first(x):
        nonlocal first, rest
        # 此处替换为你原有的push_first逻辑
        old_first = first
        first = x
        if rest is None:
            rest = make_mutable_rlist()

    # 创建命名空间对象并绑定方法
    rlist_obj = types.SimpleNamespace()
    rlist_obj.push_first = push_first

    def __getitem__(key):
        if hasattr(rlist_obj, key):
            return getattr(rlist_obj, key)
        raise KeyError(f"Method '{key}' not found")

    rlist_obj.__getitem__ = __getitem__
    return rlist_obj

两种方案的核心逻辑一致:当执行my_list['push_first']时,Python会调用对象的__getitem__方法,返回对应的操作函数,后续即可正常执行(x)调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:56:01