local variable 'a' referenced b
Dave Angel
d at davea.name
Tue Oct 2 22:26:23 EDT 2012
On 10/02/2012 10:03 PM, contro opinion wrote:
> code1
>>>> def foo():
> ... a = 1
> ... def bar():
> ... b=2
> ... print a + b
> ... bar()
> ...
> ...
>>>> foo()
> 3
>
> code2
>>>> def foo():
> ... a = 1
> ... def bar():
> ... b=2
> ... a = a + b
Because your function bar() has an assignment to a, it becomes a local,
and masks access to the one in the containing function.
Then because when you start executing that assignment statement, a
hasn't yet gotten a value, you get the error below.
> ... print a
> ... bar()
> ...
>>>> foo()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 7, in foo
> File "<stdin>", line 5, in bar
> UnboundLocalError: local variable 'a' referenced b
>
> why code2 can not get output of 3?
>
In Python3, you can avoid the "problem" by declaring a as nonlocal.
def foo():
a = 1
def bar():
nonlocal a
b=2
a = a + b
print (a)
bar()
foo()
if you're stuck with Python2.x, you can use a mutable object for a, and
mutate it, rather than replace it. For example,
def foo():
a = [3]
def bar():
b=2
a.append(b) #this mutates a, but doesn't assign it
print (a)
a[0] += b #likewise, for a number within the list
print (a)
bar()
That should work in either 2.x or 3.2
--
DaveA
More information about the Python-list
mailing list