It is the way Python handles objects. Unlike variables in C/C++ where a variable can point to an address location in the memory Python uses variables to point to an object.
Now in the first case what you are doing is pointing x to the object 1 in x=1. When you print x it just prints 1. When you try to assign x to x+1 you are pointing x in the class's scope to a new object which is x + 1 or 2. And that's why you get the weird results. The other cases can be expanded on the same basis. You can understand more about Python objects in the execution model documentation(http://docs.python.org/3/reference/executionmodel.html). Another good read would be http://www.jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/. Cheers! Satyajit http://satyajit.ranjeev.in On 04-Dec-2012, at 9:24 AM, Anand Chitipothu <anandol...@gmail.com> wrote: > Python scoping rules when it comes to classes are so confusing. > > Can you guess what would be output of the following program? > > x = 1 > > class Foo: > print(x) > x = x + 1 > print(x) > > print(x, Foo.x) > > Now take the same piece of code and put it in a function. > > def f(): > x = 1 > > class Foo: > print(x) > x = x + 1 > print(x) > > print(x) > print(Foo.x) > > f() > > To add more to your confusion, try this too: > > def g(): > y = 1 > class Foo: > y = 2 > def gety(self): > return y > > foo = Foo() > print(y, foo.y, foo.gety()) > > g() > > Does it make any sense? > > -- > Anand > http://anandology.com/ > _______________________________________________ > BangPypers mailing list > BangPypers@python.org > http://mail.python.org/mailman/listinfo/bangpypers _______________________________________________ BangPypers mailing list BangPypers@python.org http://mail.python.org/mailman/listinfo/bangpypers