در پایتون، کپی کردن لیستها (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 | عمیق | همه سطوح مستقل، مناسب لیستهای تو در تو |
این روشها تمام نیازهای کپیبرداری از لیستها در پایتون را پوشش میدهند.