更好的方法初始化带可变对象的多维数组

1 投票
1 回答
517 浏览
提问于 2025-04-16 23:28

我想创建一个多维数组,并用可变对象的副本来初始化它。这是我目前的代码:

import copy

def create_array(dimensions):
    dimensions = copy.deepcopy(dimensions)
    dimensions.reverse()
    a = [0] * dimensions[0]
    del dimensions[0]
    for d in dimensions:
        a = [copy.deepcopy(a) for _ in range(d)]
    return a

def create_array_mutable(dimensions, obj):
    a = create_array(dimensions)
    def set(x):
        if isinstance(x[0], list):
            for e in x:
                set(e)
        else:
            for i in range(len(x)):
                x[i] = copy.deepcopy(obj)
    set(a)
    return a

我在想有没有更好的方法来做到这一点(不使用副本和递归)?

1 个回答

2

这样做怎么样:

import copy

def create_array_mutable(dims, obj):
  if len(dims) == 0:
    return copy.deepcopy(obj)
  else:
    return [create_array_mutable(dims[1:], obj) for i in xrange(dims[0])]

class C(object): pass

print create_array_mutable((2,3,4), C())

这段代码会创建一个大小为 2x3x4 的数组,里面包含了不同的 C 类的实例。

这个方法还是用到了递归,不过我觉得递归很适合解决这个问题。

撰写回答