python - `del` statement and free variables -


testing python code today tried following code:

(the following runs on python 3.2+, although previous versions raise syntaxerror when del used , variable referenced in enclosing scope)

def x():     n = 200     def y():             print(n)     del n     y() x()  nameerror: free variable 'n' referenced before assignment in enclosing scope  

as can see, python not raises nameerror: global name 'n' not defined, , made me wondering 1 thing is:

when del statement used withing enclosing scope of function delete free variable that's used inside nested function y function here , thereafter if free variable in our case n deleted through del statement in enclosing scope, del delete name's (n) value , keeps bound enclosing scope ?

a) why raises: nameerror: free variable 'n' referenced before assignment... rather nameerror: global name 'n' not defined?

b) how del delete name? unbind value , keep in scope ?

i found similar case here

it works this: when write print(n) inside y not assign n in y, means @ time y defined, python looks in enclosing scopes find nearest 1 name n assigned. doesn't matter whether assignment n happens before or after definition of y, or whether it's later undone del; looks nearest enclosing scope assignment n exists. in case, since n assigned inside x, y makes little note saying "when need n, in scope of x".

so when call y, looks n in scope of x. if isn't there, error. note same error without del if move n = 100 line after call y.


Comments