递归N维数组创建函数在分配值时遇到问题

时间:2020-10-12 08:38:42

标签: python recursion multidimensional-array nested-lists

我编写了一个函数,该函数应该使用嵌套列表来递归地创建包含值的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]]]

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

简短答案:替换:

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

具有:

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

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

详细说明: List of lists changes reflected across sublists unexpectedly

答案 1 :(得分:0)

调用该函数后,您可以完成

import numpy as np
example = np.array(example,copy=True).tolist()

这是因为您正在重复使用同一对象进行计算。但是,在这种情况下,您可以通过将numpy本身与

一起使用来替换原始的createboard
import numpy as np
example = np.ones(dimensions)*value