Получил это упражнение на экзамене по Python. Попытка вернуть глубокую копию списка следующим образом:
l = list()
l = [0,1,2]
l1 = l
l[0] = 1
l1 должен содержать [0,1,2]
, а не [1,1,2]
Упражнение указано для его реализации с помощью метакласса.
class deep(type):
def __new__(meta, classname, bases, classDict):
return type.__new__(meta, classname, bases, classDict)
def __init__(cls, name, bases, dct):
super(deep, cls).__init__(name, bases, dct)
def __call__(cls, *args, **kwds):
return type.__call__(cls, *args, **kwds)
class list(metaclass=deep):
def __init__(self):
pass
Насколько я знаю, '='
в python — это оператор, а не оператор, и его нельзя переопределить. Любая идея о том, как вернуть глубокую копию по заданию? Пробовали довольно много, но безуспешно.
l1 = l[:]
). Использование метаклассов здесь кажется излишним. - person Frédéric Hamidi   schedule 24.02.2012homework
илиexam
. - person ninjagecko   schedule 24.02.2012__repr__
в списки. Надеюсь, это поможет. - person Don Question   schedule 24.02.2012from copy import deepcopy
иb=deepcpy(a)
, иначе копируется только основной список, а все вложенные классы-контейнеры сохраняются в качестве ссылок в новом списке! Вы можете проверить это, например:for l in (a,b): id(l); map (id,l)
- person Don Question   schedule 24.02.2012deep
в этом контексте отдельно. Тем не менее, список в вопросе имеет глубину только одного уровня, поэтому копия фрагмента будет работать :) - person Frédéric Hamidi   schedule 24.02.2012