Лучший способ инициализировать многомерный массив с изменяемым объектом - PullRequest
1 голос
/ 12 августа 2011

Я хочу создать многомерный массив и инициализировать его копиями изменяемого объекта.Вот что у меня есть:

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 голосов
/ 19 сентября 2011

Как насчет:

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.

Решение все еще рекурсивное, но я думаю, что рекурсия довольно хорошаяподходит для этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...