You are right in mentioning scopes. Lets take case 2:
def f(): x = 1 # x is pointing to object 1 class Foo: print(x) # what you are doing is printing object 1 x = x + 1 # you are defining x in the class's scope and pointing it to the object 2 print(x) # printing out the x in the class's scope print(x) # gives 1 as that's the object x is pointing in f()'s scope print(Foo.x) # gives 2 - the object x is pointing in Foo's scope f() Take case 3: def g(): y = 1 class Foo: y = 2 def gety(self): return y foo = Foo() print(y, foo.y, foo.gety()) # when you print y it prints the y in g()'s scope. # when you print foo.y, you print y defined in Foo's scope. # foo.gety() does not return Foo.y rather the y defined earlier in the # method. # If you print locals() in gety() you will get something similar to : # {'y': 1, 'self': <__main__.Foo instance at 0x10c8041b8>, 'Foo': <class __main__.Foo at 0x10c822bb0>} # so what happens is that you are still accessing y of the functions scope. # If you had returned self.y or a Foo.y it would have been different. g() I don't think the first two cases are weird. But yes, case 3 does seem a bit weird especially while returning y in the method call. On 04-Dec-2012, at 9:42 AM, Anand Chitipothu <anandol...@gmail.com> wrote: > On Tue, Dec 4, 2012 at 9:38 AM, Satyajit Ranjeev > <satyajit.ranj...@gmail.com> wrote: >> 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. > > Well, *the class scope* is quite different from function scope. > > The same code that works in a class, fails in a function. > > x = 1 > > class Foo: > x = x + 1 > > def f(): > x = x + 1 > >> >> The other cases can be expanded on the same basis. > > Did you try the other ones? > > Anand > _______________________________________________ > 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