Python: Inheritance of a class attribute (list)

Sano98 picture Sano98 · Mar 21, 2010 · Viewed 16.8k times · Source

inheriting a class attribute from a super class and later changing the value for the subclass works fine:

class Unit(object):
    value = 10

class Archer(Unit):
    pass

print Unit.value
print Archer.value

Archer.value = 5

print Unit.value
print Archer.value

leads to the output:
10
10
10
5
which is just fine: Archer inherits the value from Unit, but when I change Archer's value, Unit's value remains untouched.

Now, if the inherited value is a list, the shallow copy effect strikes and the value of the superclass is also affected:

class Unit(object):
    listvalue = [10]

class Archer(Unit):
    pass

print Unit.listvalue
print Archer.listvalue

Archer.listvalue[0] = 5

print Unit.listvalue
print Archer.listvalue

Output:
10
10
5
5

Is there a way to "deep copy" a list when inheriting it from the super class?

Many thanks
Sano

Answer

mikerobi picture mikerobi · Mar 21, 2010

It is not a matter of shallow or deep copies, it is a matter of references and assignments.

It the first case Unit.value and Archer.value are two variables which reference the same value. When you do Archer.value = 5, you are assigning a new reference to Acher.value.

To solve your problem you need to assign a new list value to the Archer.list.

If these values are only going to be accessed by class methods, then the simplest solution is to do the assignment when the class is initialized.