Python - Copy Lists

در پایتون، کپی کردن لیست‌ها (Copy Lists) روش‌های مختلفی دارد.
اینکه از کدام روش استفاده کنید بستگی دارد که بخواهید کپی سطحی (shallow copy) یا کپی عمیق (deep copy) داشته باشید.

🔹 1️⃣ روش ساده: = (تخصیص مستقیم)

original = [1, 2, 3] copy_list = original
  • نکته مهم: این روش کپی واقعی نیست.

  • هر تغییر در copy_list روی original هم تأثیر می‌گذارد.

copy_list[0] = 99 print(original) # [99, 2, 3] → تغییر کرد!

🔹 2️⃣ کپی سطحی با ()copy

original = [1, 2, 3] copy_list = original.copy() copy_list[0] = 99 print(original) # [1, 2, 3] → دست نخورده print(copy_list) # [99, 2, 3]
  • فقط لیست اصلی سطح اول کپی می‌شود.

  • اگر لیست تو در تو باشد، تغییرات در لیست‌های داخلی روی هر دو اثر می‌گذارد.

🔹 3️⃣ کپی سطحی با Slice

original = [1, 2, 3] copy_list = original[:] copy_list[1] = 88 print(original) # [1, 2, 3] print(copy_list) # [1, 88, 3]

🔹 4️⃣ استفاده از ()list

original = [1, 2, 3] copy_list = list(original)
  • نتیجه همانند ()copy یا slicing است.

  • برای همه انواع iterableها قابل استفاده است (لیست، tuple، string و …).

🔹 5️⃣ کپی عمیق (Deep Copy)

برای لیست‌های تو در تو، اگر بخواهید همه سطوح کپی شوند، از ()copy.deepcopy استفاده کنید:

import copy original = [[1, 2], [3, 4]] copy_list = copy.deepcopy(original) copy_list[0][0] = 99 print(original) # [[1, 2], [3, 4]] → اصلی تغییر نکرد print(copy_list) # [[99, 2], [3, 4]]
  • بدون deepcopy، تغییر در لیست‌های داخلی روی لیست اصلی هم اثر می‌گذارد.

✅ نکات مهم

  • = فقط یک ارجاع (reference) ایجاد می‌کند، کپی واقعی نیست.

  • copy(), slicing [:] و ()list → کپی سطحی (shallow copy)

  • ()copy.deepcopy → کپی کامل (deep copy) برای لیست‌های تو در تو.

  • برای لیست‌های تک‌سطحی، ()copy یا slicing بهترین و سریع‌ترین انتخاب است.

💡 خلاصه:

روشنوع کپیتوضیح
=ارجاعتغییر لیست جدید روی اصلی اثر می‌گذارد
()copyسطحیتغییر سطح اول مستقل، تو در تو مشترک
[:]سطحیهمانند ()copy
()listسطحیتبدیل iterable به لیست، کپی سطح اول
()copy.deepcopyعمیقهمه سطوح مستقل، مناسب لیست‌های تو در تو

این روش‌ها تمام نیازهای کپی‌برداری از لیست‌ها در پایتون را پوشش می‌دهند.