پایتون

جلسه ۲۲: scope های توابع در پایتون

در این درس چند چیز مهم در مورد scope های توابع یاد خواهیم گرفت.

scope یک تابع به معنای این است که کدها، متغیرها و سایر مواردی که داخل یک تابع هستند، ما به عنوان کاربر، چه میزان دسترسی به آن ها داریم.

در پایتون scope های تابع، بدنه خود تابع هستند.

وقتی یک تابع اجرا میشود، برنامه به scope آن تابع میرود. وقتی که تابع به انتها میرسد از آن خارج و به scope بیرونی میرود.

چرخه حیات داده‌ها

در پایتون داده‌هایی که داخل یک تابع ساخته میشوند از بیرون تابع قابل دسترسی نیستند مگر اینکه آن ها را به عنوان خروجی تابع برگردانیم.

متغیرها درون توابع از بقیه برنامه جداشده‌اند. وقتی که تابع تمام میشود آن ها از حافظه حذف میشوند و دیگر قابلیت دسترسی به آن‌ها نداریم.

به عنوان مثال، کد زیر کار نخواهد کرد و به ارور بر میخورد.

def func():
    name = "Stark"


func()
print(name)  # Accessing 'name' outside the function

همانطور که میبینید متغیر name در scope بیرونی وجود ندارد و پایتون این را به ما میگوید.

به طور مشابه، یک تابع به داده‌های خارج از scope خود دسترسی ندارد مگر اینکه به عنوان ورودی به تابع داده بشود.

name = "Ned"


def func():
    name = "Stark"


func()
print(name)  # The value of 'name' remains unchanged.

تغییر داده‌ها

وقتی داده‌های قابل تغییر داشته باشیم(mutable) یک تابع میتواند آن را تغییر دهد و آن تغییر در خارج از آن scope و تابع هم باقی خواهد ماند. به عنوان مثال لیست ها، داده‌های قابل تغییر هستند.

برای داده های تغییر ناپذیر (immutable) توابع میتوانند آن‌ها را تغییر دهند اما این تغییر فقط داخل تابع است و خارج از آن scope،داده بدون تغییر است.  نمونه این داده ها اعداد و string ها هستند.

حال در مثال زیر بیایید و مقدار یک integer را داخل یک تابع تغییر دهیم.

num = 20


def multiply_by_10(n):
    n *= 10
    num = n  # Changing the value inside the function
    print("Value of num inside function:", num)
    return n


multiply_by_10(num)
print("Value of num outside function:", num)  # The original value remains unchanged

بنابراین مشخص شد که داده‌های immutable تحت تاثیر عملکرد یک تابع نیستند. اگر ما نیاز داشته باشیم به اینکه یک متغیر را داخل تابع تغییر دهیم و از آن تغییر یافته شده استفاده کنیم باید به عنوان یک خروجی آن را تعریف کنیم(return).

حال یک متغیر mutable را درون یک تابع تغییر میدهیم.

num_list = [10, 20, 30, 40]
print(num_list)


def multiply_by_10(my_list):
    my_list[0] *= 10
    my_list[1] *= 10
    my_list[2] *= 10
    my_list[3] *= 10


multiply_by_10(num_list)
print(num_list)  # The contents of the list have been changed

ما لیست num_list را به تابع به عنوان پارامتر my_list داده‌ایم. اکنون هر تغییری که روی my_list انجام شود بازتاب آن روی num_list در خارج از تابع خواهد بود. که این موضوع در مورد داده های immutable صحیح و برقرار نیست.

در این مرحله، ما توانستیم درک بهتری از scope ها داشته باشیم.

در درس بعدی تعدادی از توابع داخلی پایتون را بررسی خواهیم کرد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا