← Back to DevBytes

Fix 'NameError' in Python

What is a NameError?

A NameError in Python occurs when you try to use a variable, function, or module name that hasn’t been defined yet—or isn’t visible in the current scope. The interpreter literally doesn’t know what you’re referring to, so it raises this exception with a message like:

NameError: name 'some_name' is not defined

This is one of the most common errors beginners encounter, and even experienced developers see it regularly during rapid prototyping. The good news: every NameError gives you a clear hint about exactly which name is missing, making it straightforward to fix once you understand the root cause.

Why fixing NameError matters

A NameError stops your program immediately. In production code, unhandled NameError exceptions can crash services, corrupt data pipelines, or leave users with cryptic failure messages. For developers, quickly diagnosing and eliminating these errors is essential to:

Common causes of NameError

🚀 Deploy your AI agent in 10 minutes

Managed Hermes hosting. Zero DevOps. 100M tokens/mo included.

Try it free →

1. Misspelling a variable or function name

A single typo is the most frequent culprit. Python treats my_var and my_varr as completely different names.

# Misspelled variable
count = 10
print(conut)   # NameError: name 'conut' is not defined

2. Using a variable before it is assigned

Python executes code sequentially. If you reference a name before any value is bound to it, you’ll see a NameError.

print(total)  # NameError
total = 42

3. Forgetting to import a module or a specific name

Using math.sqrt() without import math or referencing pi without importing it from math triggers a NameError.

# Missing import
result = math.sqrt(16)  # NameError: name 'math' is not defined

4. Scope confusion – local vs. global

Variables defined inside a function are local to that function. Trying to use them outside, or assuming a global variable is automatically visible in a nested scope without proper declaration, leads to errors.

def compute():
    result = 100   # local variable

print(result)      # NameError: name 'result' is not defined

5. Deleting a name with del then referencing it

The del statement removes a name from the namespace. Any subsequent use of that name raises a NameError.

data = [1, 2, 3]
del data
print(data)   # NameError: name 'data' is not defined

6. String / variable confusion (missing quotes)

Sometimes you intend to use a string literal but forget the quotes. Python then thinks you’re referencing a variable.

print(hello)   # NameError, if you meant print("hello")

7. Using a name inside a comprehension before assignment

List comprehensions have their own scope, but the iterable expression is evaluated in the enclosing scope. If you reference an undefined name there, you get a NameError.

[x*2 for x in undefined_list]   # NameError

How to fix NameError – step by step

1. Read the error message carefully

The error message tells you exactly which name is missing. For example:

NameError: name 'user_input' is not defined

The missing name is user_input. That’s your starting point.

2. Check spelling and case sensitivity

Python names are case-sensitive. MyVar, myvar, and MYVAR are three distinct names. Verify each reference matches the original definition exactly.

# Correct the typo
count = 10
print(count)   # works perfectly

3. Ensure the name is defined before use

Move the assignment above the line that causes the error, or restructure your logic so that the variable is always created before it’s accessed.

# Fix order
total = 42
print(total)   # fine

4. Import missing modules or names

Add the necessary import statement at the top of your file or inside the function that needs it.

# Fix missing import
import math
result = math.sqrt(16)   # works

If you only need a specific function, you can import it directly:

from math import pi
print(pi)   # no error

5. Fix scope issues

If you need a value from a function, return it and capture it in a variable outside.

def compute():
    result = 100
    return result

output = compute()
print(output)   # prints 100, no NameError

When you genuinely need to modify a global variable inside a function, use the global keyword (use sparingly).

counter = 0

def increment():
    global counter
    counter += 1

increment()
print(counter)   # prints 1

6. Avoid del unless absolutely necessary, then check references

If you must delete a name, ensure no subsequent code relies on it. Often it’s safer to let names fall out of scope naturally or set them to None.

data = [1, 2, 3]
data = None   # safer than del, still allows checks
if data is not None:
    print(data)

7. Use quotes for strings

Always wrap literal strings in quotes. If you intend to use a variable, make sure it’s defined.

print("hello")   # correct string literal

8. Handle dynamic names with try/except or getattr

In rare cases where you work with dynamically constructed names (e.g., from user input), you can catch the NameError or use globals() / locals() with caution. This is generally discouraged for production code but useful in debugging tools.

name = "unknown_var"
try:
    print(globals()[name])
except KeyError:
    print(f"Variable {name} not defined")

A cleaner pattern uses try/except directly on the suspected name:

try:
    print(undefined_var)
except NameError:
    print("undefined_var is not defined, using fallback")

Best practices to prevent NameError

Real-world debugging walkthrough

Imagine you’re writing a small utility that reads a CSV file and computes the average of a column. You run it and see:

Traceback (most recent call last):
  File "avg.py", line 8, in <module>
    print(compute_avg(data))
NameError: name 'data' is not defined

Your code looks like this:

import csv

def compute_avg(numbers):
    return sum(numbers) / len(numbers)

with open("sales.csv") as f:
    reader = csv.reader(f)
    sales = [int(row[2]) for row in reader]

print(compute_avg(data))   # mistake: should be 'sales'

The error message points to the line print(compute_avg(data)). You realize you defined sales but tried to use data. The fix is simply correcting the variable name:

print(compute_avg(sales))

The program now runs correctly. This simple example illustrates how quickly a NameError can be resolved when you check the error message, locate the definition, and align the names.

Conclusion

NameError is Python’s way of telling you that a name doesn’t exist in the current namespace. While it can be frustrating at first, every occurrence is an opportunity to sharpen your understanding of scoping, imports, and naming discipline. By reading the error message carefully, checking spelling and definition order, fixing imports, and respecting scope boundaries, you can resolve these errors in seconds. Adopting best practices like using linters, writing small functions, and avoiding global state will prevent most NameError exceptions from ever appearing. Remember: every undefined name has a defined fix—keep calm, read the traceback, and trace the name back to its source.

🚀 Need a reliable AI agent for your project?

Deploy Hermes Agent in 10 minutes. Managed hosting, zero DevOps.

Get Started — $23.99/mo
← Back to all articles