如何通过索引列表访问Python多维列表且避免大量复制?
解决Python多维列表按索引列表访问元素的问题
你之前的循环赋值方式根本不会产生大量复制——这是对Python列表索引机制的误解。Python中列表的索引操作list[idx]返回的是对应元素的引用,而非元素的副本。你的代码里data_tmp = data_tmp[elem]只是让变量指向嵌套结构里的下一层对象,完全没有复制数据的操作,效率很高。
下面给你几种更简洁但同样无复制的实现方式:
方式一:保留循环(最直观且高效)
你的原始代码其实已经是最优解之一,稍作封装更易用:
def get_nested_element(data, indices): current = data for idx in indices: current = current[idx] return current
调用示例:
data = [[[1,2], [3,4]], [[5,6], [7,8]]] indices = [0, 1, 0] print(get_nested_element(data, indices)) # 输出3
方式二:用reduce简化代码
借助functools.reduce和operator.getitem可以把循环写成一行,底层逻辑和循环完全一致,同样无复制:
from functools import reduce import operator def get_nested_element(data, indices): return reduce(operator.getitem, indices, data)
这个写法更简洁,适合追求代码紧凑的场景。
额外说明
- 如果访问的是可变元素(比如子列表),返回的是原对象的引用,修改返回值会直接改变原多维列表的内容;
- 如果访问的是不可变元素(比如整数、字符串),返回的是值本身,但这是不可变对象的特性,和复制无关,也不会额外占用内存。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

