خاصية Copy Lists
في بايثون تشير إلى إنشاء نسخة من قائمة موجودة. هذا مهم جدًا لتجنب تعديل القائمة الأصلية عن طريق الخطأ عند إجراء تغييرات على النسخة. هناك طريقتان رئيسيتان لنسخ القوائم في بايثون:
1. النسخ السطحي (Shallow Copy):
- ينشئ كائن قائمة جديد، ولكنه لا ينسخ العناصر الموجودة داخل القائمة بشكل متكرر. بدلاً من ذلك، يحتفظ بالإشارات (المراجع) إلى العناصر الأصلية.
- إذا كانت القائمة تحتوي على عناصر قابلة للتغيير (مثل القوائم المتداخلة)، فإن تعديل هذه العناصر سيؤثر على كل من القائمة الأصلية والنسخة.
- يتم استخدام
list.copy()
أو[:]
(slice notation) لإنشاء نسخة سطحية.
مثال:
Python
original_list = [1, 2, [3, 4]]copied_list = original_list.copy()
copied_list[0] = 10 # تغيير عنصر في النسخةcopied_list[2][0] = 30 # تغيير عنصر في قائمة متداخلة
print(original_list) #Output: [1, 2, [30, 4]]print(copied_list) #Output: [10, 2, [30, 4]]
في هذا المثال، تغيير copied_list[0]
لم يؤثر على original_list[0]
، لكن تغيير copied_list[2][0]
أثر على original_list[2][0]
لأن كلاهما يشيران إلى نفس القائمة المتداخلة في الذاكرة.
2. النسخ العميق (Deep Copy):
- ينشئ كائن قائمة جديد وينسخ جميع العناصر بشكل متكرر، بما في ذلك القوائم المتداخلة.
- لا يشارك الكائن الجديد أي مراجع مع الكائن الأصلي.
- يتم استخدام
copy.deepcopy()
من وحدةcopy
لإنشاء نسخة عميقة.
مثال:
Python
import copy
original_list = [1, 2, [3, 4]]copied_list = copy.deepcopy(original_list)
copied_list[0] = 10 # تغيير عنصر في النسخةcopied_list[2][0] = 30 # تغيير عنصر في قائمة متداخلة
print(original_list) # Output: [1, 2, [3, 4]]print(copied_list) # Output: [10, 2, [30, 4]]
هنا، تغيير copied_list
لا يؤثر على original_list
بأي شكل من الأشكال.
متى تستخدم النسخ السطحي والعميق؟
- استخدم النسخ السطحي عندما لا تحتوي قائمتك على أي عناصر قابلة للتغيير (مثل القوائم المتداخلة أو الكائنات). إنه أسرع وأقل استهلاكًا للذاكرة.
- استخدم النسخ العميق عندما تحتوي قائمتك على عناصر قابلة للتغيير وتريد التأكد من أن التغييرات على النسخة لن تؤثر على الأصل.
مثال على استخدام [:]
(slice notation) للنسخ السطحي:
Python
original_list = [1, 2, 3]copied_list = original_list[:] # نفس عمل original_list.copy()
copied_list[0] = 10
print(original_list) #Output: [1, 2, 3]print(copied_list) #Output: [10, 2, 3]