Skip to content Skip to sidebar Skip to footer

Class Variables: "class List" Vs "class Boolean"

I don't understand the difference in the following example. One time an instance of a class can CHANGE the class variable of another instance and the other time it can't? Example 1

Solution 1:

In first case there is no assignment in add method:

defadd(self):
    self.mylist.append(1)  # NOT self.mylist = something

In second case there is an assignment:

defbankrupt(self) :
    self.crisis = True# self.crisis = something

When an attribute is set on instance, it is always set on particular instance only (it's put to instance's __dict__ atribute). Class __dict__ is unaffected.

In first case there is no assignment, so standard look-up rules apply. Since there is no "mylist" in __dict__ attribute of instance, it falls back to class __dict__.

Operation performed in addmutates value stored in MyClass.__dict__. That's why change is observable in all instances.

Consider following snippet (it may explain your issue better):

classMyClass:
    x = []

x1 = MyClass()
x2 = MyClass()
x3 = MyClass()

x1.x.append(1)

print x1.x  # [1]print x2.x  # [1]print x3.x  # [1]assert x1.x is x2.x is x3.x

x3.x = "new"# now x3.x no longer refers to class attributeprint x1.x # [1]print x2.x # [1]print x3.x # "new"assert x1.x is x3.x  # no longer True!

Post a Comment for "Class Variables: "class List" Vs "class Boolean""