使用乘法创建列表但不是每个列表镜像

Create a list utilizing multiplication but not have each list mirror

小问题,希望大家帮忙:

这是我的代码:

def nd_mkboard(dims, filler):
     n = len(dims)
     helpboard = [filler]
     helpboard = helpboard * dims[n-1]
     for i in reversed(range(n)):
         if i != 1:
             helpboard = [helpboard] * dims[i-1]
     return helpboard

例如:

stuff = nd_mkboard([2, 4, 2], False)
print(stuff)

[[[False, False], [False, False], [False, False], [False, False]], 
[[False, False], [False, False], [False, False], [False, False]]]

stuff[0][0][0] = True
print(stuff)

[[[True, False], [True, False], [True, False], [True, False]],
[[True, False],  [True, False], [True, False], [True, False]]]

如何避免这个链接问题?我只想要:

[[[True, False], [False, False], [False, False], [False, False]], 
[[False, False], [False, False], [False, False], [False, False]]]

this question

列表是参考。所以复制列表就是复制引用,这意味着你最终指向的是同一个东西。

乘以列表就是制作多个副本,如上所述。

要解决此问题,请使用 list[:] 切片表示法克隆列表,或构建代码以在每次迭代时创建新列表。

就复制而言,您几乎注定要失败,因为这是您想要避免的。您可以使用 copy.deepcopy,但最好只编写一个递归函数。

更新:

这是一个递归构建结构的函数,也可以处理构造的对象。

def make_structure(dim1, *args, fill=None):
    fill = False if fill is None else fill
    get_fill = lambda: fill() if callable(fill) else fill

    result = []
    for i in range(dim1):
        if len(args):
            result.append(make_structure(*args, fill=fill))
        else:
            result.append(get_fill())

    return result

lines = [2,4,2]

s = make_structure(2,4,2)
print(s)
s[0][0][0] = True
print(s)

class TestObj:
    def __init__(self):
        self.id = id(self)

    def __repr__(self):
        return str(self.id)

s = make_structure(2,4,2,fill=TestObj)
print(s)
s[0][2][1] = TestObj()
print(s)

更新二:

列表而不是参数:

def make_structure(dims, fill=None):
    fill = False if fill is None else fill
    get_fill = lambda: fill() if callable(fill) else fill

    result = []
    for i in range(dims[0]):
        if len(dims) > 1:
            result.append(make_structure(dims[1:], fill=fill))
        else:
            result.append(get_fill())

    return result