On Tuesday 04 December 2012 09:24 AM, Anand Chitipothu 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)

Prints the global x

     x = x + 1
     print(x)
Prints the local x, with the reference to the global x lost in the classes 
scope.


print(x, Foo.x)

prints (1, 2) -- ie: the 'global x' and the class local x. So, does the right thing. What were you expecting ?


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()


Again, global versus local difference for the /class/. Still not sure what you were expecting,

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()

Ok, this is slightly confusing but still consistent. You'd understand the source of your confusion if you changed the definition for gety() to:
...
...
        def gety(self):
            return self.y
...
...


Does it make any sense?
Well, it does if you know the rules.

http://effbot.org/pyfaq/what-are-the-rules-for-local-and-global-variables-in-python.htm

Try this:

x = 1
class Foo:
    print(x)  # this is the global x
    x = x + 1 # this is the local x
    print(x)
    global x  # now lets be explicit
print(x, Foo.x)

what happened here ?

cheers,
- steve

_______________________________________________
BangPypers mailing list
BangPypers@python.org
http://mail.python.org/mailman/listinfo/bangpypers

Reply via email to