خطای NameError در پایتون؛ name is not defined یعنی چه و چطور رفع میشود؟

🗓 آخرین بهروزرسانی:
پیام NameError: name '...' is not defined یعنی پایتون نامی را در کد شما دیده که هیچ تعریفی از آن پیدا نکرده است. این نام میتواند یک متغیر، تابع، کلاس یا ماژول باشد. این خطا بسیار رایج است و تقریباً همیشه دلیلش یک غلط تایپی، ترتیب اشتباه کد یا فراموش کردن import است.
معنی خطای NameError در پایتون
در پایتون قبل از استفاده از هر نامی، باید آن را تعریف کنید؛ یعنی مقداری به متغیر بدهید، تابع را با def بسازید یا ماژول را import کنید. وقتی پایتون در زمان اجرا به نامی برسد که در محدوده (Scope) فعلی و محدودههای بالاتر وجود ندارد، خطای NameError میدهد. برخلاف SyntaxError، این خطا در زمان اجرا رخ میدهد؛ پس خطوط قبل از آن اجرا شدهاند.
علتهای رایج این خطا
- غلط تایپی در نام متغیر یا تابع (پایتون به بزرگی و کوچکی حروف حساس است:
Nameباnameفرق دارد). - استفاده از متغیر قبل از تعریف آن.
- فراموش کردن کوتیشن دور یک رشته؛ مثلاً
print(hello)به جایprint("hello"). - فراموش کردن import ماژول، مثل استفاده از
math.sqrtبدونimport math. - تعریف متغیر داخل تابع و استفاده از آن بیرون تابع.
کد غلط و کد درست (با خروجی واقعی)
همه نمونهکدهای زیر با پایتون 3.13.5 اجرا شدهاند و خروجیها همان چیزی است که پایتون واقعاً نمایش میدهد.
مثال 1: غلط تایپی و حساسیت به حروف
❌ کد غلط:
user_name = "Ali"
print(User_name)خروجی:
Traceback (most recent call last):
File "/home/user/project/main.py", line 2, in <module>
print(User_name)
^^^^^^^^^
NameError: name 'User_name' is not defined. Did you mean: 'user_name'?✅ کد درست:
user_name = "Ali"
print(user_name)خروجی:
Aliمثال 2: رشته بدون کوتیشن
❌ کد غلط:
print(hello)خروجی:
Traceback (most recent call last):
File "/home/user/project/main.py", line 1, in <module>
print(hello)
^^^^^
NameError: name 'hello' is not defined. Did you mean: 'help'?✅ کد درست:
print("hello")خروجی:
helloمثال 3: فراموش کردن import
❌ کد غلط:
print(math.sqrt(25))خروجی:
Traceback (most recent call last):
File "/home/user/project/main.py", line 1, in <module>
print(math.sqrt(25))
^^^^
NameError: name 'math' is not defined. Did you forget to import 'math'?✅ کد درست:
import math
print(math.sqrt(25))خروجی:
5.0راهحل قدمبهقدم
- نامی که داخل کوتیشن پیام خطا آمده را دقیقاً در کد جستوجو کنید.
- املای آن را با جایی که تعریفش کردهاید مقایسه کنید (حروف بزرگ و کوچک را هم).
- مطمئن شوید تعریف متغیر یا تابع قبل از خط استفاده قرار دارد.
- اگر نام مربوط به ماژول است، دستور import را در ابتدای فایل اضافه کنید.
- اگر متغیر داخل تابع تعریف شده، آن را با
returnبرگردانید یا به عنوان آرگومان پاس دهید.
خواندن پیام NameError و عیبیابی
NameError با پیام name is not defined یعنی پایتون نامی را در هیچکدام از محدودهها (محلی، سراسری و داخلی) پیدا نکرده است. علت میتواند غلط املایی، استفاده از متغیر قبل از تعریف، فراموش کردن import یا نوشتن رشته بدون کوتیشن باشد. پایتون 3.13 اغلب نام مشابه را با Did you mean پیشنهاد میدهد.
ترتیب اجرا مهم است: پایتون کد را از بالا به پایین اجرا میکند، پس متغیر یا تابعی که پایینتر تعریف شده هنوز وجود ندارد. در Jupyter این خطا وقتی هم رخ میدهد که سلول تعریف را اجرا نکرده باشید یا kernel را ریاستارت کرده باشید. حالت خاص آن UnboundLocalError است.
غلط املایی، ترتیب تعریف و import
user_name = "Sara"
try:
print(username)
except NameError as error:
print(type(error).__name__, "-", error)
try:
print(math.pi)
except NameError as error:
print(type(error).__name__, "-", error)
import math
print("pi:", round(math.pi, 2), "user:", user_name)خروجی (اجراشده با Python 3.13):
NameError - name 'username' is not defined
NameError - name 'math' is not defined
pi: 3.14 user: Saraقدمبهقدم رفع NameError
پایتون نام را در هیچ محدودهای پیدا نکرده؛ ببینید چرا.
- املای نام را مقایسه کنید: پیشنهاد Did you mean را بخوانید و حروف بزرگ و کوچک را چک کنید.
- ترتیب اجرا را بررسی کنید: آیا تعریف متغیر یا تابع پایینتر از محل استفاده است؟
- import ها را چک کنید: برای نام ماژولها مثل math یا os، مطمئن شوید import در بالای فایل هست.
- مسیرهای شرطی را ببینید: اگر متغیر فقط داخل یک if تعریف شده، در مسیر دیگر وجود ندارد.
- محدوده تابع را بررسی کنید: متغیر محلی یک تابع در تابع دیگر دیده نمیشود؛ آن را بهعنوان آرگومان یا return منتقل کنید.
چکلیست پیشگیری
- از ویرایشگری با تکمیل خودکار استفاده کنید تا غلط املایی نامها کم شود.
- همه import ها را در بالای فایل بنویسید.
- متغیرها را قبل از if و حلقه مقدار اولیه بدهید تا در همه مسیرها تعریف شده باشند.
- در Jupyter بعد از ریاستارت، سلولها را به ترتیب با Run All اجرا کنید.
- از linter مثل ruff یا pyflakes استفاده کنید تا نامهای تعریفنشده قبل از اجرا گزارش شوند.
📌 همچنین بخوانید: خطای unexpected EOF while parsing در پایتون، خطای ‘int’ object is not subscriptable در پایتون و خطای ImportError
سؤالات متداول
فرق NameError با AttributeError چیست؟
NameError یعنی خود نام وجود ندارد؛ AttributeError یعنی شیء وجود دارد ولی ویژگی یا متدی که صدا زدهاید را ندارد (مثل "abc".push()).
چرا در Jupyter بعد از ریاستارت NameError میگیرم؟
با ریاستارت کرنل همه متغیرها پاک میشوند. سلولهایی که متغیرها را تعریف میکنند را دوباره به ترتیب اجرا کنید.
آیا متغیر داخل حلقه for بیرون از حلقه قابل استفاده است؟
بله؛ در پایتون متغیر حلقه بعد از پایان حلقه هم وجود دارد، به شرط آنکه حلقه حداقل یک بار اجرا شده باشد. اما متغیرهای داخل تابع بیرون از تابع در دسترس نیستند.
UnboundLocalError چه ارتباطی با NameError دارد؟
زیرکلاس NameError است و وقتی رخ میدهد که داخل تابع به متغیری مقدار بدهید و قبل از آن بخوانیدش؛ با global یا ارسال آرگومان رفع میشود.
چرا متغیری که داخل if تعریف کردم بیرون شناخته نمیشود؟
اگر شرط برقرار نبوده، خط تعریف اصلاً اجرا نشده؛ قبل از if مقدار پیشفرض بدهید.
name 'true' is not defined چطور رفع میشود؟
در پایتون مقادیر منطقی True و False با حرف بزرگ شروع میشوند و None هم همینطور.
آموزشهای مرتبط
- متغیرها در پایتون
- محدوده متغیرها (local و global)
- ماژولها و پکیجها در پایتون
- آموزش جامع پایتون از صفر تا پیشرفته
- همه خطاهای رایج پایتون و راهحل آنها