Curious case of UnboundLocalError

Terry Reedy tjreedy at udel.edu
Fri Mar 30 11:08:36 EDT 2018


On 3/30/2018 7:25 AM, Johannes Bauer wrote:
> On 30.03.2018 13:13, Ben Bacarisse wrote:
> 
>>> import collections
>>>
>>> class Test(object):
>>> 	def __init__(self):
>>> 		z = {
>>> 			"y": collections.defaultdict(list),
>>
>> This mention of collections refers to ...
>>
>>> 		}
>>> 		for (_, collections) in z.items():
>>
>> ... this local variable.
> 
> Yup, but why? I mean, at the point of definition of "z", the only
> definition of "collections" that would be visible to the code would be
> the globally imported module, would it not? How can the code know of the
> local declaration that only comes *after*?

Python functions are compiled in two passes. The first pass collects all 
un-dotted identifiers and classifies them as global, nonlocal, or local. 
  For CPython, the second pass does the actual compilation to bytecode. 
Local names are converted to indexes in a local values array.

In 3.x, 'from mod import *' is prohibited within functions to avoid the 
complication of needing an unoptimized backup plan.

-- 
Terry Jan Reedy




More information about the Python-list mailing list