confusing UnboundLocalError behaive

Gabriel Genellina gagsl-py2 at
Mon Feb 23 03:47:13 EST 2009

En Mon, 23 Feb 2009 06:06:58 -0200, neoedmund <neoedmund at>  

> it seems "you cannot change the outter scope values but can use it
> readonly."

Python doesn't have variable "declarations" - so the compiler uses this  
rule: "if the variable is assigned to, anywhere in the function body, it's  
local". This is done by static analysis when the code is compiled.

> 2.
> def test():
> 	abc="111"
> 	def m1():
> 		print(abc)
> 		abc+="222"
> 	m1()
> test()
> Output:
>    print(abc)
> UnboundLocalError: local variable 'abc' referenced before assignment

abc is assigned to, so it is local (and different from the abc in its  
enclosing scope). You can't print abc until it is assigned "something".

> 3.
> def test2():
> 	abc=[111]
> 	def m1():
> 		print(abc)
> 		abc.append(222)
> 	m1()
> 	print(abc)

No assignment to abc, so it's not local; print(abc) starts looking for it  
in all the enclosing scopes (up to the module global scope, and last, the  
builtin module).

Gabriel Genellina

More information about the Python-list mailing list