CodeShot
Juniorسختی 3 از ۵· در 72٪ مصاحبه‌های این حوزه پرسیده شده

تفاوت انواع Mutable و Immutable در پایتون چیست و چرا استفاده از یک مقدار پیش‌فرض Mutable در تابع خطرناک است؟

☆نشان کردن

پاسخ کوتاه

انواع Mutable (مثل list، dict) بعد از ساخته‌شدن قابل تغییرند؛ انواع Immutable (مثل str، int، tuple) قابل تغییر نیستند و هر «تغییر» عملاً یک شیء جدید می‌سازد.

پاسخ کامل
  • Immutable: int، float، str، tuple — یک‌بار ساخته می‌شوند و دیگر تغییر نمی‌کنند؛ عملیاتی مثل الحاق رشته، شیء جدیدی برمی‌گرداند.
  • Mutable: list، dict، set — می‌توان محتوای همان شیء را در جای خودش تغییر داد.

نکته خطرناک: مقدار پیش‌فرض یک پارامتر تابع فقط یک‌بار، هنگام تعریف تابع، ساخته می‌شود. اگر آن مقدار پیش‌فرض یک لیست باشد، همه فراخوانی‌های بعدی همان لیست را به اشتراک می‌گذارند.

مثال کد

# ❌ باگ رایج
def add_item(item, items=[]):
    items.append(item)
    return items

print(add_item(1))  # [1]
print(add_item(2))  # [1, 2]  <- انتظار [2] بود!

# ✅ درست
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

نکته مهم

منبع کامل موضوع: Data Structures — The Python Tutorial.

اشتباه رایج

❌ استفاده از list/dict به‌عنوان مقدار پیش‌فرض پارامتر یک تابع — همیشه از None و ساخت داخل بدنه تابع استفاده کنید.