Confused by Python and nested scoping (2.4.3)

Schüle Daniel uval at rz.uni-karlsruhe.de
Thu Apr 20 00:12:20 EDT 2006


Sean Givan schrieb:
> Hi.  I'm new to Python

welcome

> ago.  I was doing some experiments with nested functions, and ran into 
> something strange.
> 
> This code:
> 
> def outer():
>     val = 10
>     def inner():
>         print val
>     inner()
> 
> outer()
> 
> ...prints out the value '10', which is what I was expecting.
> 
> But this code..
> 
> def outer():
>     val = 10
>     def inner():
>         print val
>         val = 20
>     inner()
>     print val
> 
> outer()
> 
> ...I expected to print '10', then '20', but instead got an error:
> 
>   print val
> UnboundLocalError: local variable 'val' referenced before assignment.
> 
> I'm thinking this is some bug where the interpreter is getting ahead of 
> itself, spotting the 'val = 20' line and warning me about something that 

just a little carefull thought
if something that basic should really be a bug
how many thousand people would discover it daily?

> doesn't need warning.  Or am I doing something wrong?

yes, you can't modify it
you can do it for global namespace or local
but not inbetween

val = 0
def outer():
	val = 10
	def inner():
		global val
		val = 30
	inner()
	print val
outer()
10		# outer val is not changed
print val	# global is modified
30

hth, Daniel




More information about the Python-list mailing list