
This is the first, and most common, error every Python programmer encounters: NameError ‘…’ not defined. It has a very simple meaning: “You asked me to use a variable, but I have no memory of you creating it.”
โก Quick Fix: NameError: name ‘โฆ’ is not defined โ Python Variable Typo, Execution Order, and Scope Fix
Python hit a name it has never seen โ either a typo, a variable used before assignment, or a local variable accessed outside its function.
# Fix 1 โ Typo: match spelling and capitalization exactly
message = "Hello, world!"
print(message) # Not: mesage, Message, or MESSAGE
# Fix 2 โ Order: define variables before you use them
my_name = "Alice"
print(my_name) # Definition always comes first
# Fix 3 โ Scope: return local variables to use them outside
def my_function():
my_result = 100
return my_result
result = my_function()
print(result) # Output: 100read through the 3 root causes below to find which one broke your code and fix it permanently.
Cause 1: A Simple Typo (90% of cases)
You created a variable, but misspelled it when you tried to use it. Remember: Python is case-sensitive! message and Message are two different variables.
Problem Code:
message = "Hello, world!" print(mesage) # Misspelled 'message' # CRASH! NameError: name 'mesage' is not defined
The Fix: Check your spelling and capitalization exactly.
Cause 2: Order of Operations
Python reads your script from top to bottom. You must define a variable before you can use it.
Problem Code:
print(my_name) # You can't use it yet... my_name = "Alice" # ...it's only defined here! # CRASH! NameError: name 'my_name' is not defined
The Fix: Move your variable definitions to the top of your script.
Cause 3: Variable “Scope”
The variable does exist, but it’s “trapped” inside a function and you’re trying to use it outside.
Problem Code:
def my_function():
my_result = 100
print("Inside function:", my_result)
my_function()
print("Outside function:", my_result) # CRASH!
# CRASH! NameError: name 'my_result' is not definedThe Fix: The my_result variable is “local” to the function. If you need that value outside, you must return it from the function.
def my_function():
my_result = 100
print("Inside function:", my_result)
return my_result # Pass the value out
result_from_outside = my_function() # Catch the value
print("Outside function:", result_from_outside)What This Error Exposes About Python’s Name Resolution System
NameError: name '...' is not defined is Python’s LEGB lookup โ Local, Enclosing, Global, Built-in โ returning empty at every level. The interpreter searches all four scopes in order and raises the error the moment it exhausts every option without finding the name. No fallback, no default, no suggestion โ just a hard stop at the first unresolved reference.
The typo scenario is the most common trigger and the easiest to miss because the human eye autocorrects familiar words. mesage and message look nearly identical in a quick scan, and case differences like My_name vs my_name disappear entirely on small screens. A configured linter like flake8 or an LSP-enabled editor catches undefined names at the point of use before the script runs โ that single tool eliminates the entire typo category from your runtime errors.
The scope scenario exposes Python’s most important architectural boundary. Every variable assigned inside a function exists only in that function’s local frame โ the moment the function returns, that frame is destroyed and every local name with it. The return statement is the only sanctioned exit path for a value computed inside a function. Developers coming from languages with looser scoping rules reach for global as a workaround, but global variables create hidden dependencies between functions that make code unpredictable at scale. Return the value, catch it at the call site, and keep every function’s output explicit โ that pattern scales cleanly from a ten-line script to a production codebase.





