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