🔹وقتی در تعریف یک تابع در پایتون، مقداری مثل یک لیست ([]) یا دیکشنری ({}) را بهعنوان مقدار پیشفرض قرار میدهید، پایتون این شیء را فقط یکبار (در زمان تعریف تابع و Load شدن کد) در حافظه میسازد.
🔹 از آنجایی که لیستها و دیکشنریها قابل تغییر (Mutable) هستند، اگر تابع را چند بار بدون پاس دادن ورودی جدید فراخوانی کنید، پایتون هر بار از همان شیء قدیمی در حافظه استفاده میکند. در نتیجه، تغییرات در فراخوانیهای قبلی، روی فراخوانیهای بعدی اثر میگذارد!
🔹 به جای این کد:
#در این کد، لیست users فقط یکبار ساخته میشود و تمام کاربران جدید به همان یک لیست اضافه میشوند.
def add_user(user_name, user_list=[]):
user_list.append(user_name)
return user_list
# فراخوانی اول
print(add_user("امیر"))
# خروجی: ['امیر']
# فراخوانی دوم (بدون پاس دادن لیست جدید)
print(add_user("سارا"))
# خروجی انتظار میرفت ['سارا'] باشه، اما میشه: ['امیر', 'سارا']
🔹 اینجوری بنویس:
#از None به عنوان مقدار پیشفرض استفاده میکنیم و داخل تابع بررسی میکنیم که اگر مقدار None بود، یک لیست جدید ایجاد شود.
def add_user(user_name, user_list=None):
if user_list is None:
user_list = [] # ایجاد لیست جدید در هر بار اجرای تابع
user_list.append(user_name)
return user_list
print(add_user("امیر")) # خروجی: ['امیر']
print(add_user("سارا")) # خروجی: ['سارا'] (کاملاً مستقل و درست!)
🐍 @python_rd