On Wed, Dec 17, 2008 at 4:03 PM, Rhodri James <rho...@wildebst.demon.co.uk> wrote: > On Wed, 17 Dec 2008 15:19:32 -0000, walterbyrd <walterb...@iname.com> wrote: > >> However in the methods are within a class, the scoping seems to work >> differently. > > Not really. Hopefully this commentary will show you why. > >> class ab(): >> def a(self): >> self.x = 99 >> print self.x >> def b(self): >> print self.x >> >> i = ab() > > This creates |i|, an instance of class |ab|. As yet it is pure and virgin, > having nothing but the methods that it gets from |ab|. Soon this will > change... > >> i.a() > > This creates an attribute |x| in |i|, and assigns the number 99 to it. > >> i.b() # this works, why no lexical scoping? > > This works because you ran |i.a()| first, so |i.x| exists and can be printed > out. Lexical scoping is going on here, you're just mistaking what's being > scoped; it's the |self| in |b|, which is in scope because it's a parameter. > This particular |self| (the |i| you made earlier) happens to have an > attribute |x|, so it all works. If however you'd written: > > j = ab() > j.b() > > then Python would whinge mightily at you, claiming that it knoweth naught of > this |x| attribute of which you speak, and can it go home now for this is a > silly place. The |self| in |b| is still in lexical scope, though. >
Relatedly, Python has no notion of 'declaring' instance variables in a class (instead, you just create them in __init__ or other methods), and class variables (in Java terminology: 'static' variables) do not constitute a scope for variable lookup. Python is still lexically scoped, it's just that only functions and the "globals"/toplevel/module-level constitute scopes, not class bodies. Cheers, Chris -- Follow the path of the Iguana... http://rebertia.com -- http://mail.python.org/mailman/listinfo/python-list