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

Понимание списка - лучший способ сделать это. Если вы определяете новый класс и перегружаете оператор *, это серьезно путает следующего человека, чтобы прочитать код.