مقدار پیش‌فرض mutable یک تابع در پایتون

سلام،
توی Tutorial رسمی پایتون در مورد توابع می‌خوندم، یه قسمتی نوشته بود که حواستون باشه که مقدار پیش‌فرض یا همون Default Value فقط یک بار evaluate میشه و این قضیه وقتی Default Value یه Mutable Object باشه تفاوت ایجاد می‌کنه.

Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:

مثالی که زده شد:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

خروجی:

[1]
[1, 2]
[1, 2, 3]

این خروجی برام خیلی عجیبه، چون به هر حال local variable هستش و نباید این اتفاق می‌افتاد.

برای رفع این مشکل گفته یه همیچین کاری باید بکنیم:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

که این رو هم خیلی درک نمی‌کنم.

فکر کنم پایتون قبل از اجرا میاد واسه همه چیزایی که مقدارشون مشخصه ی آیدی در نظر میگیره

مثل این:

1 Likes

بله، به این خاطر که مقدار پیشفرض در فانکشن آبکت ذخیره میشه اما با هر کال دوباره مورد بازخوانی قرار نمیگیره، اگر با آبجکتی سر و کار داشته باشید که قابل تغییر باشه مثل بیشتر آبجکت ها در پایتون، نتیجه همونطور که نشون دادی یکم عجیب بنظر میاد، در صورتی که واقعا عجیب نیست فقط باید رفتار پایتون رو درک کرد

3 Likes