首页 > 解决方案 > 具有赋值问题的递归 N 维数组创建函数

问题描述

我编写了一个函数,该函数应该使用嵌套列表递归地创建包含值的 n 维数组,表面上确实如此。(Dimensions 是一个具有数组 n 维维度的元组,即 (3,3,3) 是一个 3x3x3 数组)。但是,我的函数创建的数组存在赋值问题,因为它们无法在不将该值分配给其他嵌套列表的情况下将值分配给单个索引。奇怪的是,当我声明一个具有相同维度和值但使用一行嵌套列表的数组时,即使 python 声明对象相等,使用“手动”数组进行赋值也可以正常工作。

def createboard(dimensions,value):
    if dimensions[1:]:
        return dimensions[0]*[createboard(dimensions[1:],value)]
    else:
        return dimensions[0]*[value]

example = createboard((3,3,2),0)
print(example)
manual = [[[0, 0], [0, 0], [0, 0]],
    [[0, 0], [0, 0], [0, 0]],
    [[0, 0], [0, 0], [0, 0]]]
print(manual == example)
example[1][1][0] = True
print('example =', example)
manual[1][1][0] = True
print('example =', manual)

输出:

[[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
True
example = [[[True, 0], [True, 0], [True, 0]], [[True, 0], [True, 0], [True, 0]], [[True, 0], [True, 0], [True, 0]]]
example = [[[0, 0], [0, 0], [0, 0]], [[0, 0], [True, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]

谢谢你的帮助。

标签: pythonrecursionmultidimensional-arraynested-lists

解决方案


简短回答:替换:

return dimensions[0]*[createboard(dimensions[1:],value)]

和:

return [createboard(dimensions[1:],value) for _ in range(dimensions[0])]

请注意,前者只进行一次递归调用,而后者进行dimensions[0]递归调用,这要昂贵得多;但后者实际上创建了dimensions[0]不同的列表,而不是多次重用同一个列表。

详细解释: 列表列表变化意外跨子列表反映


推荐阅读