چالش روزانه · ۲۲ مهر ۱۴۰۵

چالش پایتون ۹: تابع، متغیر سراسری را کِی می‌خواند؟

قبل از اجرای کد، خروجی آن را پیش‌بینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه می‌کند.

x = 5

def g(y):
    print(x + y)

x = 10
g(1)
خروجی کدام است؟

نمایش پاسخ و توضیح

پاسخ درست: گزینهٔ ب — 11

نکته

def فقط تابع را تعریف می‌کند؛ هیچ مقداری را «عکس نمی‌گیرد» و ذخیره نمی‌کند. داخل g هیچ انتسابی به x نیست، پس x یک متغیر سراسری است و پایتون مقدارش را در لحظهٔ اجرای print(x + y) می‌خواند.

ترتیب اتفاق‌ها:

  1. x = 5
  2. تابع g تعریف می‌شود (کد داخلش اجرا نمی‌شود).
  3. x = 10
  4. g(1) اجرا می‌شود ← x الان 10 است ← 10 + 1 = 11

خروجی: 11

مقایسه با UnboundLocalError

اگر داخل g جایی x = ... نوشته بودیم، پایتون x را در کل تابع محلی در نظر می‌گرفت و خواندنش قبل از مقداردهی، UnboundLocalError می‌داد (چالش ۲). اینجا چنین انتسابی نیست، پس خبری از آن خطا نیست.

حالا خودت اجرا کن و تغییرش بده

x = 5

def g(y):
    print(x + y)

x = 10
g(1)