چالش روزانه · ۲۲ مهر ۱۴۰۵
چالش پایتون ۹: تابع، متغیر سراسری را کِی میخواند؟
قبل از اجرای کد، خروجی آن را پیشبینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه میکند.
x = 5
def g(y):
print(x + y)
x = 10
g(1)نمایش پاسخ و توضیح
پاسخ درست: گزینهٔ ب — 11
نکته
def فقط تابع را تعریف میکند؛ هیچ مقداری را «عکس نمیگیرد» و ذخیره نمیکند. داخل g هیچ انتسابی به x نیست، پس x یک متغیر سراسری است و پایتون مقدارش را در لحظهٔ اجرای print(x + y) میخواند.
ترتیب اتفاقها:
x = 5- تابع
gتعریف میشود (کد داخلش اجرا نمیشود). x = 10g(1)اجرا میشود ←xالان10است ←10 + 1 = 11
خروجی: 11
مقایسه با UnboundLocalError
اگر داخل g جایی x = ... نوشته بودیم، پایتون x را در کل تابع محلی در نظر میگرفت و خواندنش قبل از مقداردهی، UnboundLocalError میداد (چالش ۲). اینجا چنین انتسابی نیست، پس خبری از آن خطا نیست.
حالا خودت اجرا کن و تغییرش بده
x = 5
def g(y):
print(x + y)
x = 10
g(1)