Python如何保留二维整数列表的元素引用或对应索引?
二维列表元素引用存储问题的解决方案
为什么无法直接存储原列表元素的引用
Python中的整数属于不可变内置类型,当你执行test_triangle[i][j]做取值操作时,拿到的是这个整数对象本身,不存在能反向绑定原列表内存位置的“可更新引用”。
你可以通过下面的代码验证这个特性:
test_triangle = [[1], [2, 3], [4, 5, 6]] test_list = [test_triangle[0][0], test_triangle[1][0]] # 修改原列表对应位置的元素 test_triangle[0][0] = 999 print(test_list) # 输出仍然是[1, 2],不会随着原列表的修改同步更新
这说明从语法层面,你根本没法通过直接取整数的方式,把原列表的“位置关联关系”存到另一个列表里——取到的只有当时的静态数值,和原列表已经没有绑定了。
最适配需求的实现方案
既然直接存引用的路径走不通,完全可以通过存储元素在原列表中的二维索引,来实现你需要的位置跟踪效果:
- 遍历构建
path列表时,不要存入aTriangle[i][j]的数值,而是存入形如(i, j)的二元索引元组 - 需要获取路径上对应元素的数值时,再通过索引从原
aTriangle中查询即可
示例代码:
aTriangle = [[1], [2, 3], [4, 5, 6]] path = [] # 遍历过程中记录走过的位置 path.append( (0, 0) ) path.append( (1, 0) ) # 直接打印path,看到的就是和原列表绑定的位置信息 print(path) # 输出[(0, 0), (1, 0)] # 需要取路径上的数值时,再从原列表查询 path_values = [aTriangle[row][col] for row, col in path] print(path_values) # 输出[1, 2]
这种方式的优势:
- 完全和原列表的位置绑定,不会因为整数不可变的特性丢失位置关联
- 原列表的数值后续无论怎么修改,只要存储的索引正确,随时可以查到对应位置的最新值
- 内存开销极低,不需要额外包装复杂的对象
补充说明:如果确实需要实现“自动取最新值”的效果,也可以通过lambda闭包把查询逻辑包起来存到path里,但这种方式调试成本高、容易引发内存泄漏,远不如直接存索引的方案实用,没有特殊需求不推荐使用。
内容的提问来源于stack exchange,提问作者CatalunaLilith
相关产品推荐
相关产品推荐

