Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python copy.deepcopy() function not working properly [duplicate]

I have been playing with the deepcopy function and the copy function and I get the same issue with both of them. It is like the copy was a reference (or a pointer) instead of a proper copy. I am working with data records (classes) in Python, maybe it could be that.. I show you an example:

>>> import copy
>>> class player1:
...    age = 23
...    score = 1
>>> class player2:
...    age = 14
...    score = 2
>>> player3 = copy.deepcopy(player1)

I print the parameters.

>>> print player1.age, player1.score
23 1
>>> print player2.age, player2.score
14 2
>>> print player3.age, player3.score
23 1

Now I increment the score parameter in player1 data record.

>>> player1.score += 3

And I print the results again.

>>> print player1.age, player1.score
23 4
>>> print player2.age, player2.score
14 2
>>> print player3.age, player3.score
23 4 

WHY HAS PLAYER 3 CHANGED? I just incremented a parameter in player1, not player3. It is mutable instead of immutable.

Thanks in advance.

like image 410
Ramon Blanquer Avatar asked Feb 27 '14 20:02

Ramon Blanquer


1 Answers

The problem is that you are actually copying the class definition and not an instance of the class.

Another problem of the code is that the attributes age and score are part of the class and will be shared between all instances of that class. This is probably not what you intended.

What you probably want to do is:

import copy
class Player:
    def __init__(self, age, score):
        self.age = age
        self.score = score

player1 = Player(23, 1)
player2 = Player(14, 2)
player3 = copy.deepcopy(player1)

player1.age += 1

print "player1.age", player1.age
print "player3.age", player3.age

This gives you what you expect:

player1.age 24
player3.age 23
like image 56
Johannes Overmann Avatar answered Oct 19 '22 03:10

Johannes Overmann