پیش از این، در مطلب «دامنه متغیرها در پایتون — به زبان ساده»، به مفهوم متغیر محلی، سراسری و غیر محلی پرداخته و مثال‌های متعددی برای هر یک از حالات بیان شد. در این مطلب، مفهوم کلیدواژه global در پایتون همراه با مثال‌های متنوع بیان شده است.

کلیدواژه global در پایتون

کلیدواژه global در پایتون برای ویرایش متغیر بیرون از دامنه کنونی مورد استفاده قرار می‌گیرد. این متغیر، برای ساخت یک «متغیر سراسری» (Global Variable) و انجام تغییراتی روی متغیر در زمینه محلی استفاده می‌شود.

قواعد کلیدواژه global

قواعد پایه‌ای برای تعیین کلیدواژه سراسری در پایتون، در ادامه بیان شده‌اند.

  • هنگامی که یک متغیر درون تابع ساخته می‌شود، به طور پیش‌فرض محلی است.
  • هنگامی که یک متغیر بیرون از تابع تعریف می‌شود، به طور پیش‌فرض سراسری است و نیازی به استفاده از کلیدواژه global در پایتون نیست.
  • از کلیدواژه global در پایتون برای خواندن و نوشتن یک متغیر سراسری درون یک تابع استفاده می‌شود.
  • استفاده از کلیدواژه global بیرون از تابع، هیچ اثری ندارد.

استفاده از کلیدواژه global در پایتون

در ادامه، مثال‌هایی پیرامون چگونگی استفاده از متغیر global در پایتون، آورده شده است.

مثال ۱: دسترسی به متغیر global در پایتون از درون یک تابع

c = 1 # global variable

def add():
    print(c)

add()

خروجی حاصل از اجرای برنامه بالا، به صورت زیر خواهد بود.

1

گاهی ممکن است بنا به دلایلی، نیاز به ویرایش متغیر سراسری از داخل یک تابع وجود داشته باشد. در مثال زیر، این کار انجام شده است.

مثال ۲: ویرایش متغیر global در پایتون و از درون یک تابع

c = 1 # global variable
    
def add():
    c = c + 2 # increment c by 2
    print(c)

add()

خروجی حاصل از اجرای برنامه بالا، به صورت زیر خواهد بود. در واقع، پس از اجرای برنامه بالا، یک پیغام خطا نمایش داده می‌شود.

UnboundLocalError: local variable 'c' referenced before assignment

به همین دلیل است که به متغیر سراسری فقط می‌توان از درون تابع دسترسی داشت؛ اما نمی‌توان آن را از درون تابع ویرایش کرد. راهکاری برای این مساله، استفاده از کلیدواژه global در پایتون است.

مثال ۳: تغییر متغیر سراسری از درون یک تابع با استفاده از global

c = 0 # global variable

def add():
    global c
    c = c + 2 # increment by 2
    print("Inside add():", c)

add()
print("In main:", c)

خروجی حاصل از اجرای قطعه کد بالا، به صورت زیر است.

Inside add(): 2
In main: 2

در برنامه بالا، c به عنوان یک کلیدواژه سراسری، درون تابع ()add تعریف شده است. سپس، متغیر c، دو تا افزایش داده می‌شود (c = c + 2). پس از آن، تابع ()add فراخوانی می‌شود. در نهایت، متغیر سراسری c چاپ می‌شود. همانطور که مشهود است، تغییرات روی متغیر سراسری بیرون از تابع c = 2 نیز انجام می‌شوند. در پایتون، یک ماژول مجرد config.py برای نگه داشتن متغیر سراسری و به اشتراک‌گذاری اطلاعات در سراسر ماژول‌های پایتون در همان برنامه، مورد استفاده قرار می‌گیرد. در ادامه، مثالی از چگونگی استفاده از متغیر سراسری در ماژول‌های پایتون آورده شده است.

مثال ۴: به اشتراک‌گذاری یک متغیر سراسری درون ماژول‌های پایتون

یک فایل config.py برای ذخیره‌سازی متغیرهای سراسری ساخته می‌شود.

a = 0
b = "empty"

یک فایل update.py برای تغییر متغیرهای محلی ساخته می‌شود.

import config

config.a = 10
config.b = "alphabet"

یک فایل main.py برای تست تغییرات مقادیر ساخته می‌شود.

import config
import update

print(config.a)
print(config.b)

هنگام اجرای فایل main.py، خروجی به صورت زیر خواهد بود.

10
alphabet

در مثال بالا، سه فایل ساخته شده است: update.py، config.py و main.py. ماژول config.py، متغیرهای محلی a و b را ذخیره می‌کند. در فایل update.py، ماژول config.py را باید وارد (ایمپورت | Import) و مقدار a و b را ویرایش کرد. به طور مشابه، در فایل main.py، ماژول‌های config.py و update.py را باید وارد کرد. در نهایت، مقادیر متغیرهای سراسری چاپ و بررسی می‌شوند که آیا تغییر کرده‌اند یا خیر.

متغیر سراسری در توابع تو در تو

در اینجا، روش استفاده از متغیر سراسری در توابع تو در تو بیان شده است.

def foo():
    x = 20

    def bar():
        global x
        x = 25
    
    print("Before calling bar: ", x)
    print("Calling bar now")
    bar()
    print("After calling bar: ", x)

foo()
print("x in main : ", x)

خروجی حاصل از اجرای کد بالا، به صورت زیر است.

Before calling bar: 20
Calling bar now
After calling bar: 20
x in main : 25

در برنامه بالا، متغیر سراسری درون تابع تو در تو ()bar تعریف شده است. درون تابع ()foo، متغیر x هیچ تاثیری از کلیدواژه سراسری ندارد. پیش و پس از فراخوانی ()bar، متغیر x مقدار متغیر محلی را دریافت می‌کند (x = 20). بیرون از تابع ()foo، متغیر x مقدار تعریف شده در تابع ()bar را می‌گیرد (x = 25). این امر بدین دلیل به وقوع می‌پیوندد که از کلیدواژه global در پایتون در x برای ساخت متغیر سراسری درون تابع ()bar استفاده می‌شود (دامنه محلی). اگر هر گونه تغییری در تابع ()bar رخ بدهد، تغییرات بیرون از دامنه محلی نیر نمایش داده خواهند شد (()foo).

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

بر اساس رای ۱۱ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.