loop scope

Dan Bishop danb_83 at yahoo.com
Thu Mar 18 22:24:51 CET 2004

Jacek Generowicz <jacek.generowicz at cern.ch> wrote in message news:<tyfd67e4fll.fsf at pcepsft001.cern.ch>...
> Imagine (for the sake of brevity of argument --- I wouldn't dream of
> suggesting such a "line-noise" syntax for Python) that you could use
> "x := 3" to mean "create a new local binding for x", while "x = 3"
> would mean "find the innermost x and rebind it", with function
> parameters, loop variables, list comprehension variables all behaving
> as if they were using ":=". Now you'll find that you gain a lot of
> flexibility to do what is appropriate with scopes of variables used in
> loops etc., and you have an opportunity to fix the immutability of
> closures ...
> (Of course there are "issues" ... what happens, for
> example when you say
>     def foo(a):
>         a := 3
>         a := 4
> ... does that make three nested scopes for a?, is it an error?)

One way to avoid this problem is to have an explicit scope-creating
construct instead.

def foo(a):
   scope outer:
      a = 3
      scope inner:
         a = 4
         print a            # prints 4
         print outer.a      # prints 3
         print foo.a        # prints the function parameter
      print a               # inner.a is out of scope, so prints 3
      foo.b = 5             # Creates a new function-scope variable.
   print b                  # prints 5

More information about the Python-list mailing list