10

In the following example I would expect deepcopy to create a copy of field and not just copy the reference. What happens here and is there an easy way around it?

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

Output:

[(5, 10)]
[(5, 10)]
Elrond1337
  • 354
  • 1
  • 3
  • 16
  • possible duplicate of [How to copy a python class?](http://stackoverflow.com/questions/9541025/how-to-copy-a-python-class) – Vajk Hermecz Feb 13 '14 at 11:10

1 Answers1

13

Deep copying (by default) only applies to instance level attributes - not class level - It doesn't make much sense that there's more than one unique class.attribute...

Change your code to:

class Test:
    def __init__(self):
        self.field = [(1,2)]
Jon Clements
  • 132,101
  • 31
  • 237
  • 267
  • 6
    Unless he overrides `__copy__`/`__deepcopy__`. Still though, that would be pretty odd. – Silas Ray Aug 21 '13 at 17:50
  • 1
    This is actually not an answer to the question, but a workaround to the problem. If you dont want to/cant instantiate the class in every case, e.g.: you have a `@classmethod`, you cannot apply this workaround... – Vajk Hermecz Feb 13 '14 at 11:12