التعامل مع القوائم المتشعبة باستخدام دالة deepcopy() في Python

تمت الكتابة بواسطة: عبد الحكيم

تارخ آخر تحديث: 21 سبتمبر 2024

محتوى المقال

التعامل مع القوائم المتشعبة باستخدام دالة deepcopy() في Python

في Python، عند التعامل مع القوائم المتشعبة (القوائم المتداخلة)، قد تحتاج أحيانًا إلى إنشاء نسخة من القائمة تكون مستقلة تمامًا عن الأصل. إذا قمت بنسخ قائمة متشعبة باستخدام النسخ السطحي (shallow copy)، فقد تتأثر النسخة بالتغييرات التي تحدث في القائمة الأصلية. للتعامل مع هذه المشكلة، تقدم Python دالة deepcopy() التي تتيح لك إنشاء نسخة عميقة (deep copy) من القائمة. في هذا المقال، سنتناول كيفية استخدام deepcopy() مع القوائم المتشعبة، وسنقدم أمثلة توضيحية.

ما هي دالة deepcopy()؟

دالة deepcopy() هي دالة متاحة في مكتبة copy القياسية في Python، وتستخدم لإنشاء نسخة عميقة من كائن معين. النسخة العميقة تُنشئ نسخة مستقلة تمامًا من جميع الكائنات المتداخلة، مما يعني أنه لا يوجد ارتباط بين النسخة والكائن الأصلي. هذا مفيد عند التعامل مع القوائم المتشعبة (المتداخلة) لتجنب التغييرات غير المقصودة.

الصيغة العامة لدالة deepcopy()

import copy
new_list = copy.deepcopy(original_list)

في هذا الصيغة، نقوم باستيراد مكتبة copy، ثم نستخدم دالة deepcopy() لإنشاء نسخة عميقة من original_list وتخزينها في new_list.

أبسط استخدام لدالة deepcopy() مع القوائم المتشعبة

لنبدأ بمثال بسيط يوضح الفرق بين النسخ السطحي (shallow copy) والنسخ العميق (deep copy) عند التعامل مع القوائم المتشعبة.

مثال: مقارنة بين النسخ السطحي والعميق للقوائم المتشعبة

import copy

# قائمة متشعبة (متداخلة)
original_list = [[1, 2, 3], [4, 5, 6]]

# نسخة سطحية
shallow_copy = copy.copy(original_list)

# نسخة عميقة
deep_copy = copy.deepcopy(original_list)

# تعديل القائمة الأصلية
original_list[0][0] = 100

# طباعة القوائم
print("القائمة الأصلية:", original_list) # الناتج: [[100, 2, 3], [4, 5, 6]]
print("النسخة السطحية:", shallow_copy) # الناتج: [[100, 2, 3], [4, 5, 6]]
print("النسخة العميقة:", deep_copy) # الناتج: [[1, 2, 3], [4, 5, 6]]

في هذا المثال، نبدأ بقائمة متشعبة تحتوي على قائمتين فرعيتين. نقوم بإنشاء نسخة سطحية باستخدام copy.copy()، ونسخة عميقة باستخدام copy.deepcopy(). عندما نقوم بتعديل أحد العناصر في القائمة الأصلية، يتأثر النسخ السطحي، بينما تظل النسخة العميقة مستقلة ولا تتأثر.

متى يجب استخدام deepcopy()؟

دالة deepcopy() مفيدة جدًا عند التعامل مع قوائم متشعبة (أو أي كائنات متداخلة) حيث تحتاج إلى التأكد من أن النسخة الجديدة مستقلة تمامًا عن الأصل. هذا يكون مهمًا عندما تريد تعديل النسخة دون التأثير على الكائن الأصلي، أو العكس.

على سبيل المثال، إذا كنت تعمل على تطبيق يتطلب تخزين بيانات مؤقتة أو التعامل مع نماذج متعددة من نفس البيانات دون تغيير البيانات الأصلية، فإن deepcopy() توفر لك الأمان والمرونة في التعامل مع النسخ المتعددة.

مثال عملي: استخدام deepcopy() لحفظ النسخ المؤقتة

import copy

# قائمة متشعبة تمثل حالة معينة
current_state = [["أ", "ب"], ["ج", "د"]]

# حفظ نسخة مؤقتة باستخدام deepcopy
saved_state = copy.deepcopy(current_state)

# تعديل الحالة الحالية
current_state[0][0] = "م"

# طباعة الحالة الحالية والنسخة المحفوظة
print("الحالة الحالية:", current_state) # الناتج: [["م", "ب"], ["ج", "د"]]
print("الحالة المحفوظة:", saved_state) # الناتج: [["أ", "ب"], ["ج", "د"]]

في هذا المثال، نقوم بتمثيل حالة باستخدام قائمة متشعبة، ثم نحفظ نسخة مؤقتة منها باستخدام deepcopy(). عندما نقوم بتعديل الحالة الأصلية، تبقى النسخة المحفوظة كما هي بدون أي تأثير.

الفرق بين النسخ السطحي والعميق

عند استخدام النسخ السطحي (shallow copy) باستخدام دالة copy()، يتم نسخ الكائن الرئيسي فقط، بينما تبقى الكائنات المتداخلة مشتركة بين النسخة الأصلية والنسخة الجديدة. هذا يعني أنه إذا قمت بتعديل كائن فرعي، فسيتأثر في كلا النسختين.

في المقابل، النسخ العميق (deep copy) باستخدام deepcopy() يقوم بإنشاء نسخ مستقلة تمامًا من الكائنات المتداخلة، مما يضمن عدم تأثر النسخة بالتغييرات التي تطرأ على الأصل.

مقارنة بين النسخ السطحي والعميق:

  • **النسخ السطحي (shallow copy)**: ينسخ الكائن الخارجي فقط، بينما تظل الكائنات المتداخلة مرتبطة بالنسخة الأصلية.
  • **النسخ العميق (deep copy)**: ينشئ نسخًا مستقلة تمامًا من الكائن الخارجي والكائنات المتداخلة، مما يضمن عدم التأثير المتبادل.

تحذيرات عند استخدام deepcopy()

رغم فوائد deepcopy()، إلا أنه يجب الحذر عند استخدامها مع الكائنات المعقدة جدًا أو الكبيرة الحجم. النسخ العميق يتطلب وقتًا وذاكرة إضافية، لذا في بعض الحالات قد يكون النسخ السطحي كافيًا إذا كنت لا تتعامل مع كائنات متداخلة أو لا تحتاج إلى نسخ عميق.

متى يكون النسخ السطحي كافيًا؟

إذا كنت تتعامل مع كائنات بسيطة أو قوائم لا تحتوي على قوائم متشعبة، فإن النسخ السطحي باستخدام copy() قد يكون كافيًا. يمكن أن يساعدك ذلك في تحسين أداء البرنامج وتوفير الموارد.

الخلاصة

دالة deepcopy() في Python هي أداة قوية ومرنة للتعامل مع القوائم المتشعبة والكائنات المتداخلة. باستخدام deepcopy()، يمكنك إنشاء نسخ مستقلة تمامًا من القوائم المتشعبة دون القلق من التأثيرات الجانبية الناجمة عن التغييرات على القائمة الأصلية. ومع ذلك، يجب استخدامها بحذر عندما تتعامل مع كائنات كبيرة أو معقدة لتجنب التأثير على أداء البرنامج.

طور مهاراتك: مقالات يجب قراءتها في البرمجة