پرسش

چطور می‌تونم یک لیست رو طوری کپی کنم که بعد از انتساب، تغییر نکنه؟

How do I clone a list so that it doesn’t change unexpectedly after assignment?

یه لیست دارم که اون رو به یه متغییری نسبت میدم، حالا میخوام اگه تغییری داخل اون لیست جدید ایجاد کردم لیست اصلی تغییر نکنه باید چیکار کنم؟

1403/05/31
پاسخ
رضا دولتی عاشق برنامه نویسی و هوش مصنوعی!
بیوگرافی رضا دولتی

برای اینکه یک لیست رو در پایتون کپی کنی بدون اینکه تغییرات در لیست جدید روی لیست اصلی تأثیر بذاره، باید از روش‌هایی استفاده کنی که یک کپی عمیق (deep copy) از لیست اصلی ایجاد می‌کنن. اگر از روش انتساب مستقیم استفاده کنی، مثل new_list = old_list، هر تغییری که روی new_list بدی، روی old_list هم تأثیر می‌ذاره چون هر دو به یک مکان در حافظه اشاره می‌کنن.

چند روش برای کپی کردن لیست وجود داره:

  1. استفاده از slicing:
new_list = old_list[:]

این روش یک کپی سطحی (shallow copy) از لیست می‌سازه که برای لیست‌های ساده جواب می‌ده. اما اگر لیست شما شامل لیست‌های تو در تو (nested lists) باشه، این روش کافی نیست.

  1. استفاده از تابع copy():
new_list = old_list.copy()

این هم مثل slicing یک کپی سطحی می‌سازه و برای لیست‌های ساده مناسبه.

  1. استفاده از کتابخونه copy برای کپی عمیق:
import copy
new_list = copy.deepcopy(old_list)

این روش یک کپی عمیق (deep copy) از لیست می‌سازه، به این معنی که حتی اگر لیست شما شامل لیست‌های تو در تو باشه، هر تغییری در لیست جدید تأثیری روی لیست اصلی نخواهد داشت.

به طور کلی، اگر لیست شما ساده است (یعنی لیست تو در تو نداره)، می‌تونی از slicing یا copy() استفاده کنی. اما اگر لیست تو در تو داره یا می‌خوای از هر نوع تغییری در لیست اصلی جلوگیری کنی، بهتره از deepcopy استفاده کنی.

پاسخ: 1403/05/31
آخرین آپدیت: 1403/07/17