When looping over objects in a list, why does calling a method of a single object, cause changes to be applied to all objects in the list?

Question:

In the following code, why does the second and third objects of the list receive the c parameter values even before their own method was called?

class a:
    c = {}
    
    def addC(self, key, error):
        self.c[key] = error

def main():
    i = 0
    aa = []
    while i < 3:
        aa.append(a())
        i += 1
    for idx, ab in enumerate(aa):
        ab.addC('try', idx)

main()

Here is a visualization of the problem:

Problem visualisation

As shown, for each object in the list, the c parameter after the first for loop iteration looks like this:

{'try': 0}

How can I achieve that the method changes only single objects c parameter value per call, when working in loop? i.e. on the first iteration aa[0].c = {'try', 0}, on the second iteration aa[1].c = {'try', 1}, and on the third iteration aa[2].c = {'try', 2}.

Asked By: EvaldasM

||

Answers:

You’re using a class variable. If you need the variable C for each object to have its own value, you should use this:

class a:
        def __init__(self):
            self.c = {}  # create instance variable
    
        def addC(self, key, error):
            self.c[key] = error
...
Answered By: MustafinMP
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.