Python глубокая копия списка по назначению - PullRequest
6 голосов
/ 24 февраля 2012

Получил это упражнение на экзамене по питону.Попытка вернуть глубокую o копию списка следующим образом:

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 является оператором, а не оператором, и его нельзя переопределить.Любая идея о том, как вернуть глубокую копию при назначении?Я очень старался, но безуспешно.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Чтобы понять, что l1 = l делает в Python, прочитайте В других языках есть "переменные", в Python есть "имена" .

Чтобы изменить то, что l[0] = 1 можно переопределить l '* __setitem__() метод:

>>> class L(list):
...     def __setitem__(self, i, v):
...         list.__setitem__(self, i, 10)
... 
>>> l = L()
>>> l.append(1)
>>> l
[1]
>>> l[0] = 0
>>> l
[10]

Чтобы изменить то, что l = List(); l = [0,1,2] позволяет определить метод List.__del__() в CPython и управлять пространством имен, к которому принадлежит l, например, используя модуль inspect.Излишне говорить, что вы никогда не должны этого делать.

>>> import inspect
>>> class L:
...     def __del__(self):
...         inspect.currentframe().f_globals['l'] = [1,2,3]
... 
>>> l = L()
>>> l = [0]
>>> l
[1, 2, 3]
1 голос
/ 24 февраля 2012

Насколько я знаю, это невозможно в python без использования какого-либо дополнительного синтаксиса. Как вы сказали, вы не можете переопределить =.

...