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

求可返回嵌套列表指定索引元素左值(引用)的Python函数

实现嵌套列表的左值定位函数

Python里没法直接返回元素的"引用",但我们可以通过定位目标元素的父容器+最后一个索引来实现你要的左值效果,完美适配你的apply函数需求。

核心实现方案

修改part_lval函数,让它返回目标元素所在的父容器,以及该元素在父容器中的索引。然后在apply里通过父容器直接修改原元素:

def part_lval(lst, *ind):
    # 遍历到倒数第二个索引,拿到目标元素的父容器
    parent = lst
    for i in ind[:-1]:
        parent = parent[i]
    # 返回父容器和最后一个索引
    return parent, ind[-1]

def apply(lst, f, ind):
    parent, idx = part_lval(lst, *ind)
    # 直接修改父容器中的对应位置,等价于 a[1][0] = f(a[1][0])
    parent[idx] = f(parent[idx])

测试验证

写个测试用的f函数,比如把字符串转大写,列表元素批量转大写:

def f(x):
    if isinstance(x, str):
        return x.upper()
    elif isinstance(x, list):
        return [item.upper() for item in x]
    return x

# 测试第一个示例
a = ['a',['b','c']]
apply(a, f, [1])
print(a)  # 输出: ['a', ['B', 'C']]

# 测试第二个示例
a = ['a',['b','c']]
apply(a, f, [1, 0])
print(a)  # 输出: ['a', ['B', 'c']]

为什么原右值函数不行?

你的原part函数返回的是元素的值(不可变类型如str是副本,可变类型如list是对象引用,但赋值res = f(res)只会改变局部变量res,不会修改原嵌套列表的结构)。比如:

a = ['a',['b','c']]
res = part(a,1,0)
res = 'B'
print(a)  # 还是['a',['b','c']],因为res只是拿到了'b'的副本,赋值不影响原列表

而我们的方案通过直接操作父容器的索引位置,真正修改了原嵌套列表的内容,完全符合你要的a[1][0] = f(a[1][0])的效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:50:25