Weird local variables behaviors

Dan Bishop danb_83 at yahoo.com
Fri Jun 20 23:48:47 EDT 2008


On Jun 20, 7:32 pm, Matt Nordhoff <mnordh... at mattnordhoff.com> wrote:
> Sebastjan Trepca wrote:
> > Hey,
>
> > can someone please explain this behavior:
>
> > The code:
>
> > def test1(value=1):
> >     def inner():
> >         print value
> >     inner()
>
> > def test2(value=2):
> >     def inner():
> >         value = value
> >     inner()
>
> > test1()
> > test2()
>
> > [trepca at sauron ~/dev/tests]$ python locals.py
> > 1
> > Traceback (most recent call last):
> >   File "locals.py", line 13, in <module>
> >     test2()
> >   File "locals.py", line 10, in test2
> >     inner()
> >   File "locals.py", line 9, in inner
> >     value = value
> > UnboundLocalError: local variable 'value' referenced before assignment
>
> > Why can't he find the variable in the second case?
>
> > Thanks, Sebastjan
>
> Python doesn't like when you read a variable that exists in an outer
> scope, then try to assign to it in this scope.
>
> (When you do "a = b", "b" is processed first. In this case, Python
> doesn't find a "value" variable in this scope, so it checks the outer
> scope, and does find it. But then when it gets to the "a = " part...
> well, I don't know, but it doesn't like it.)

In a language like C++, the scope of a variable is determined by the
declaration.

int x; // A
class Example
{
   int x; // B
   void f()
   {
      int x; // C
      x = 42; // Which x?
   }
};

The "x" referred to in the statement "x = 42;" refers to local
variable of Example::f.  If line C were removed, then it would refer
to the member variable of class Example.  And if line B were removed,
then it would refer to the global variable.

In Python, however, there are no declarations.  Therefore, it requires
another approach.  What it chose was:

(1) Explicit "self" for object attributes.
(2) A function's local variables are defined as those appearing on the
left side of an assignment.  Whether the name happens to refer to a
global is NOT considered.



More information about the Python-list mailing list