2013-08-21 3 views
3

В следующем примере я ожидал бы, что deepcopy создаст копию поля, а не просто скопирует ссылку. Что происходит здесь, и есть ли там простой способ?Python: deepcopy не работает на пользовательских классах?

from copy import deepcopy 

class Test: 
    field = [(1,2)] 

t1 = Test() 
t2 = deepcopy(t1) 

t2.field[0]=(5,10) 

print t1.field # [(1,2)] expected but [(5,10)] obtained 
print t2.field # [(5,10)] expected 

Выход:

[(5, 10)] 
[(5, 10)] 
+0

возможно дубликат [Как скопировать класс питона?] (HTTP: // stackoverflow.com/questions/9541025/how-to-copy-a-python-class) –

ответ

12

Глубокое копирование (по умолчанию) применяется только к уровню экземпляра атрибутов - не уровень класса - это не имеет особого смысла, что есть более чем один уникальный class.attribute ...

Изменить код:

class Test: 
    def __init__(self): 
     self.field = [(1,2)] 
+4

Если он не переопределяет '__copy__' /' __deepcopy__'. Тем не менее, это было бы довольно странно. –

+1

На самом деле это не ответ на вопрос, а обходной путь к проблеме. Если вы не хотите/не можете создать экземпляр класса в каждом случае, например: у вас есть '@ classmethod', вы не можете применить это обходное решение ... –

Смежные вопросы