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)

    ## Operators

View on GitHub (pinned to fba689d101)

Solutions

  1. Assign the local variable on every code path before it is read.
  2. If the variable was meant to come from an outer scope, declare it global or nonlocal before assigning.
  3. 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.