Python - использование оператора Multiply для создания копий объектов в списках
В Python, если я умножаю список объектов на целое число, я получаю список ссылок на этот объект, например:
>>> a = [[]] * 3
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1]]
Если мое желаемое поведение - создать список копий исходного объекта (например, копии, созданные методом copy.copy() "или что-то вроде стандартного, есть ли элегантный способ сделать это с тем же умножением оператор? Или я должен просто придерживаться понимания списка или чего-то еще? Например
[[] for x in range(0,3)]
Любая версия Python в порядке.
Ответы
Ответ 1
Оператор умножения на последовательности означает повторение элемента (ов) - НЕ создание копий (мелких или глубоких) элементов. Ничто не мешает вам сходить с ума, a la:
import copy
class Crazy(object):
def __init__(self, body, weird=copy.copy):
self.gomez = body
self.cousinitt = weird
def __mul__(self, n):
return [self.cousinitt(x) for x in (self.gomez * n)]
a = Crazy([[]]) * 3
... кроме вашего здравомыслия и здравого смысла, если таковые имеются. Проверка на них, как DID, о которой вы мечтали, оператор *
может быть сделан для обозначения чего-то совершенно отличного от того, что оно предназначалось для обозначения, за исключением того, что задание другого класса перегружает __mul__
странными способами...? -)
Ответ 2
Это хорошее использование понимания списка - это также самый читаемый способ сделать это IMO.
Ответ 3
Понимание списка - лучший способ сделать это. Если вы определяете новый класс и перегружаете оператор *, это серьезно путает следующего человека, чтобы прочитать код.