Python: derived classes access dictionary of base class in the same memory location

dictionary, inheritance, python

Solution

It's because `_testdict` is a class variable: it's defined only once, when the class is initially constructed. If you want it to be separate for each instance, make it an instance variable:

class BaseClass:
    _testint = 0

    def __init__(self):
        self._testdict = dict()

    def add_dict_entry(self):
        self._testdict["first"] = 1

(Note that you'd need to create `__init__` methods for `Class1` and `Class2` as well, both of which would have to call `BaseClass.__init__(self)`).

`_testint` behaves differently because you're performing a rebinding operation on it rather than a mutating operation. ints are immutable, so you can't "change" one- `self._testint += 1` is just syntactic sugar for `self._testint = self._testint + 1`. Similarly, you can perform a rebinding operation on `self._testdict` that won't be shared between instances- for example, `self._testdict = {}` will reset only that instance's `_testdict`.

Problem

I'm wondering why a dictionary, that is defined in a base class and is accessed from derived classes, is obviously present only in one memory location. A short example: ``` class BaseClass: _testdict = dict() _testint = 0 def add_dict_entry(self): self._testdict["first"] = 1 def increment(self): self._testint += 1 class Class1(BaseClass): pass class Class2(BaseClass): pass object1 = Class1() object2 = Class2() object1.add_dict_entry() object1.increment() print(object2._testdict) print(object2._testint) ``` and the output is: ``` {'first': 1} 0 ``` Why does a call to the "add_dict_entry" of object1 affect the dictionary of object2? Using integers ("increment") the base class variable is not affected. Thanks a lot. Lorenz

Original source

Related problems