Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Class scope & lists

Tags:

python

I'm still fairly new to Python, and my OO experience comes from Java. So I have some code I've written in Python that's acting very unusual to me, given the following code:

class MyClass():
        mylist = []
        mynum = 0

        def __init__(self):
                # populate list with some value.
                self.mylist.append("Hey!")
                # increment mynum.

                self.mynum += 1

a = MyClass()

print a.mylist
print a.mynum

b = MyClass()

print b.mylist
print b.mynum

Running this results in the following output:

['Hey!']
1
['Hey!', 'Hey!']
1

Clearly, I would expect the class variables to result in the same exact data, and the same exact output... What I can't seem to find anywhere is what makes a list different than say a string or number, why is the list referencing the same list from the first instantiation in subsequent ones? Clearly I'm probably misunderstanding some kind of scope mechanics or list creation mechanics..

like image 919
Russ Avatar asked Jun 30 '10 20:06

Russ


1 Answers

tlayton's answer is part of the story, but it doesn't explain everything.

Add a

print MyClass.mynum

to become even more confused :). It will print '0'. Why? Because the line

self.mynum += 1

creates an instance variable and subsequently increases it. It doesn't increase the class variable.

The story of the mylist is different.

self.mylist.append("Hey!")

will not create a list. It expects a variable with an 'append' function to exist. Since the instance doesn't have such a variable, it ends up referring the one from the class, which does exist, since you initialized it. Just like in Java, an instance can 'implicitly' reference a class variable. A warning like 'Class fields should be referenced by the class, not by an instance' (or something like that; it's been a while since I saw it in Java) would be in order. Add a line

print MyClass.mylist

to verify this answer :).

In short: you are initializing class variables and updating instance variables. Instances can reference class variables, but some 'update' statements will automagically create the instance variables for you.

like image 180
Confusion Avatar answered Oct 23 '22 19:10

Confusion