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 و ساخت داخل بدنه تابع استفاده کنید.