aosabook/500lines · error · UnboundLocalError
local variable '%s' referenced before assignment
Error message
local variable '%s' referenced before assignment
What it means
Error "local variable '%s' referenced before assignment" thrown in aosabook/500lines.
Source
Thrown at interpreter/code/byterun/pyvm2.py:319
elif name in frame.global_names:
val = frame.global_names[name]
elif name in frame.builtin_names:
val = frame.builtin_names[name]
else:
raise NameError("name '%s' is not defined" % name)
self.frame.push(val)
def byte_STORE_NAME(self, name):
self.frame.local_names[name] = self.frame.pop()
def byte_DELETE_NAME(self, name):
del self.frame.local_names[name]
def byte_LOAD_FAST(self, name):
if name in self.frame.local_names:
val = self.frame.local_names[name]
else:
raise UnboundLocalError(
"local variable '%s' referenced before assignment" % name
)
self.frame.push(val)
def byte_STORE_FAST(self, name):
self.frame.local_names[name] = self.frame.pop()
def byte_LOAD_GLOBAL(self, name):
f = self.frame
if name in f.global_names:
val = f.global_names[name]
elif name in f.builtin_names:
val = f.builtin_names[name]
else:
raise NameError("global name '%s' is not defined" % name)
f.push(val)
## OperatorsView on GitHub (pinned to fba689d101)
Solutions
- Assign the local variable on every code path before it is read.
- If the variable was meant to come from an outer scope, declare it global or nonlocal before assigning.
- Reorder the code so the STORE_FAST happens before the LOAD_FAST.
Example fix
def f():
x = 0 # initialize before any branch that might skip assignment
if cond:
x = 1
return x When it happens
Trigger: Thrown at interpreter/code/byterun/pyvm2.py:319 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of aosabook/500lines@fba689d101 (2026-08-13).
Data as JSON: /api/errors/1bad461a73f64f98.
Report an issue: GitHub.