از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
“متغیر محلی ارجاع شده قبل از انتساب” را در پایتون برطرف کنید
سرفصلهای مطلب
معرفی
اگر توسعهدهنده پایتون هستید، احتمالاً با خطاهای مختلفی مانند خطای «متغیر محلی ارجاع شده قبل از انتساب» مواجه شدهاید. این خطا می تواند کمی گیج کننده باشد، به خصوص برای مبتدیان و زمانی که شامل متغیرهای محلی/جهانی می شود.
امروز، ما این خطا را توضیح می دهیم، متوجه می شویم که چرا رخ می دهد، و می بینیم که چگونه می توانید آن را برطرف کنید.
خطای “متغیر محلی ارجاع شده قبل از انتساب”.
خطای “متغیر محلی ارجاع شده قبل از انتساب” در پایتون یک خطای رایج است که زمانی رخ می دهد که یک متغیر محلی قبل از اینکه مقداری به آن اختصاص داده شود ارجاع داده شود. این خطا یک نوع است UnboundLocalError
، زمانی که یک متغیر محلی قبل از تخصیص در محدوده محلی ارجاع داده می شود، افزایش می یابد.
در اینجا یک مثال ساده آورده شده است:
def foo():
print(x)
x = 1
foo()
اجرای این کد خطای “متغیر محلی ‘x’ ارجاع شده قبل از انتساب” را ایجاد می کند. این به این دلیل است که متغیر x
در اشاره شده است print(x)
بیانیه قبل از اینکه به آن مقداری در محدوده محلی تخصیص داده شود foo
تابع.
حتی گیج کننده تر زمانی است که شامل متغیرهای سراسری می شود. به عنوان مثال، کد زیر نیز این خطا را ایجاد می کند:
x = "Hello "
def say_hello(name):
x = x + name
print(x)
say_hello("Billy")
اما صبر کنید، چرا این نیز خطا را ایجاد می کند؟ نیست x
قبل از استفاده در say_hello
تابع؟ مشکل اینجاست که x
زمانی که “Hello” به آن اختصاص داده شود، یک متغیر جهانی است. با این حال، در say_hello
تابع، آن است ناهمسان متغیر محلی که هنوز به آن اختصاص داده نشده است.
بعداً در این بایت خواهیم دید که چگونه می توانید این موارد را نیز برطرف کنید.
رفع خطا: مقداردهی اولیه
یکی از راه های رفع این خطا، مقداردهی اولیه متغیر قبل از استفاده از آن است. این تضمین می کند که متغیر قبل از ارجاع در محدوده محلی وجود دارد.
بیایید خطای مثال اول خود را تصحیح کنیم:
def foo():
x = 1
print(x)
foo()
در این کد اصلاح شده، مقداردهی اولیه می کنیم x
با ارزش 1
قبل از چاپ آن حالا وقتی تابع را اجرا می کنید، چاپ می شود 1
بدون هیچ خطایی
رفع خطا: کلمه کلیدی جهانی
روش دیگر برای رفع این خطا، بسته به سناریوی خاص شما، استفاده از این است global
کلمه کلیدی. این به ویژه زمانی مفید است که می خواهید از یک متغیر سراسری در داخل یک تابع استفاده کنید.
در اینجا به این صورت است:
x = 0
def foo():
global x
x += 1
print(x)
foo()
در این قطعه اعلام می کنیم x
به عنوان یک متغیر سراسری در داخل تابع foo
. این به پایتون می گوید که به دنبال آن بگردد x
در گستره جهانی، نه محلی. حالا، وقتی تابع را اجرا می کنید، جهانی را افزایش می دهد x
توسط 1
و چاپ کنید 1
.
خطای مشابه: NameError
خطای مشابه خطای “متغیر محلی ارجاع شده قبل از انتساب” است NameError
. زمانی که میخواهید از یک متغیر یا نام تابعی استفاده کنید که هنوز تعریف نشده است، این افزایش مییابد.
در اینجا یک مثال ساده آورده شده است:
print(y)
اجرای این کد منجر به a NameError
:
$ python3 script.py
NameError: name 'y' is not defined
در این مورد، ما سعی می کنیم مقدار را چاپ کنیم y
، ولی y
در هیچ کجای کد تعریف نشده است. از این رو، پایتون a را افزایش می دهد NameError
. این شبیه به این است که ما سعی می کنیم از یک متغیر بدون مقدار اولیه/تعریف نشده استفاده کنیم، اما تفاوت اصلی این است که ما سعی نکردیم مقداردهی اولیه کنیم. y
هر جای دیگری از کد ما.
دامنه متغیر در پایتون
درک مفهوم دامنه متغیر می تواند به جلوگیری از بسیاری از خطاهای رایج در پایتون، از جمله خطای اصلی مورد علاقه در این بایت کمک کند. اما دامنه متغیر دقیقاً چیست؟
در پایتون، متغیرها دو نوع دامنه دارند – سراسری و محلی. متغیری که در داخل یک تابع اعلام شده است به عنوان یک متغیر محلی شناخته می شود، در حالی که متغیری که خارج از یک تابع اعلام شده است یک متغیر جهانی است.
این مثال را در نظر بگیرید:
x = 10
def my_function():
y = 5
print(y)
my_function()
print(x)
در این کد، x
یک متغیر جهانی است و y
یک متغیر محلی است. x
می توان به هر نقطه از کد دسترسی پیدا کرد، اما y
فقط در داخل قابل دسترسی است my_function
. سردرگمی پیرامون این یکی از شایع ترین دلایل خطای “متغیر ارجاع شده قبل از انتساب” است.
نتیجه
در این بایت، نگاهی به خطای “متغیر محلی ارجاع شده قبل از انتساب” و یک خطای مشابه دیگر انداخته ایم. NameError
. ما همچنین به مفهوم دامنه متغیر در پایتون پرداختیم، که یک مفهوم مهم برای درک برای جلوگیری از این خطاها است. اگر یکی از این خطاها را می بینید، دامنه متغیرهای خود را بررسی کنید و مطمئن شوید که قبل از استفاده از آنها تخصیص داده شده اند.
منتشر شده در 1402-12-26 21:42:04