"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > النسخة الضحلة مقابل النسخة العميقة – ما هما حقًا؟ - أمثلة مع JavaScript وPython

النسخة الضحلة مقابل النسخة العميقة – ما هما حقًا؟ - أمثلة مع JavaScript وPython

تم النشر بتاريخ 2024-08-31
تصفح:147

مقدمة

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

ما هي النسخة الضحلة؟

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

مثال في جافا سكريبت

const originalArray = [1, 2, [3, 4]]; const surfaceCopy = originalArray.slice(); نسخة سطحية[2][0] = 99; console.log(originalArray); // [1، 2، [99، 4]] console.log(shallowCopy); // [1، 2، [99، 4]]
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
مثال في بايثون

نسخة الاستيراد original_list = [1، 2، [3، 4]] ضحلة_نسخة = نسخة.نسخة (القائمة_الأصلية) نسخة ضحلة[2][0] = 99 طباعة (القائمة الأصلية) # [1، 2، [99، 4]] طباعة (shallow_copy) # [1، 2، [99، 4]]
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
نصيحة:

تكون النسخة السطحية مفيدة عندما تعلم أنك لا تحتاج إلى تعديل الكائنات المتداخلة. إنها أسرع وتستهلك ذاكرة أقل من النسخة العميقة.

ملحوظة:

في JavaScript، إذا كنت تستخدم Array.slice() أو Object.sign()، فأنت تقوم بعمل نسخة سطحية!

ما هي النسخة العميقة؟

A

نسخة عميقة تنسخ جميع مستويات الكائن، مما يؤدي إلى تكرار الهياكل المتداخلة. وهذا يعني أن أي تغييرات يتم إجراؤها على النسخة لن تؤثر على الكائن الأصلي.

مثال في جافا سكريبت

const originalArray = [1, 2, [3, 4]]; const DeepCopy = JSON.parse(JSON.stringify(originalArray)); نسخة عميقة[2][0] = 99; console.log(originalArray); // [1، 2، [3، 4]] console.log(deepCopy); // [1، 2، [99، 4]]
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
مثال في بايثون

نسخة الاستيراد original_list = [1، 2، [3، 4]] Deep_copy = Copy.deepcopy(original_list) نسخة عميقة [2] [0] = 99 طباعة (القائمة الأصلية) # [1، 2، [3، 4]] طباعة (نسخة عميقة) # [1، 2، [99، 4]]
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
نصيحة:

إذا كنت تعمل مع هياكل بيانات معقدة أو متداخلة، فإن النسخ العميق هو الخيار الأكثر أمانًا لتجنب الآثار الجانبية غير المرغوب فيها.

ملحوظة:

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

المقارنة المباشرة: النسخة الضحلة مقابل النسخة العميقة

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

ميزةنسخة سطحيةنسخة عميقةنسخة سطحيةنعملانسخة عميقةلانعمالتعديلات على الكائن الأصلي تؤثر على النسخةنعملاتعقيدقليلعالي
نصيحة:

تذكر أن النسخة السطحية أسرع، لكن النسخة العميقة أكثر أمانًا عند العمل مع كائنات معقدة.

حالات الاستخدام الشائعة

متى تستخدم النسخة الضحلة

    عند العمل مع كائنات أو هياكل بيانات بسيطة.
  • عندما تحتاج إلى تحسين الأداء والتعديلات العميقة ليست مشكلة.
  • أمثلة: تكوينات التطبيق، النسخ المتطابق المؤقت للبيانات.
متى تستخدم النسخة العميقة

    عند العمل مع هياكل البيانات المتداخلة أو المعقدة.
  • عندما تحتاج إلى التأكد من أن التغييرات التي يتم إجراؤها على النسخة لا تؤثر على الأصل.
  • أمثلة: معالجة البيانات المعقدة، والتطبيقات التي تتطلب مستوى عالٍ من الأمان والاتساق.
ملحوظة:

تعتبر النسخ الضحلة رائعة لتكرار إعدادات التطبيقات خفيفة الوزن أو البيانات المؤقتة!

المشاكل الشائعة وكيفية تجنبها

مشاكل مع نسخة الضحلة

من الأخطاء الشائعة استخدام نسخة سطحية بدلاً من نسخة عميقة عند تداخل البيانات. يمكن أن يؤدي هذا إلى تعديلات غير مرغوب فيها على الكائن الأصلي.

مثال:

const originalArray = [1, 2, [3, 4]]; const surfaceCopy = originalArray.slice(); نسخة سطحية[2][0] = 99; console.log(originalArray); // [1، 2، [99، 4]] (غير متوقع!)
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
نصيحة:

تحقق دائمًا مما إذا كان الكائن الخاص بك يحتوي على مستويات متداخلة قبل الاختيار بين نسخة ضحلة أو عميقة.

أدوات ووظائف لعمل نسخ في جافا سكريبت

استخدام Object.assis() للنسخ الضحل

const originalObject = { a: 1, b: { c: 2 } }; const surfaceCopy = Object.assis({}, originalObject);
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
باستخدام ... انتشار للنسخ الضحلة

const originalArray = [1, 2, 3]; const surfaceCopy = [...originalArray];
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
استخدام StructuredClone() للنسخ العميق

const originalObject = { a: 1, b: { c: 2 } }; const DeepCopy = StructuredClone(originalObject);
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
نصيحة:

structuredClone() مثالي لنسخ الهياكل المعقدة أو الدائرية دون كسر رأسك.

استخدام مكتبات مثل Lodash للنسخ العميق

const _ = require('lodash'); const originalObject = { a: 1, b: { c: 2 } }; const DeepCopy = _.cloneDeep(originalObject);
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
الأدوات والوظائف لعمل نسخ في بايثون

باستخدام وحدة النسخ

نسخة الاستيراد original_list = [1، 2، [3، 4]] ضحلة_نسخة = نسخة.نسخة (القائمة_الأصلية) Deep_copy = Copy.deepcopy(original_list)
const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]
الاختلافات بين Copy.copy() وcopy.deepcopy()

  • copy.copy(): نسخة ضحلة.
  • copy.deepcopy(): نسخة عميقة.
ملحوظة:

في بايثون، أحيانًا تكون النسخة السطحية هي كل ما تحتاجه لتجنب التغييرات غير المقصودة في قوائمك!

ملخص واستنتاج

باختصار، كل من النسخ السطحية والنسخ العميقة لها استخداماتها. المفتاح هو فهم بنية البيانات التي تعمل معها واختيار طريقة النسخ المناسبة.

الأسئلة الشائعة

1. هل النسخة السطحية دائمًا أسرع من النسخة العميقة؟

نعم، لأنه ينسخ بيانات أقل.

2. هل يمكنك عمل نسخة عميقة بدون مكتبات خارجية في JavaScript؟

نعم، باستخدام JSON.parse(JSON.stringify()) أو StructuredClone().

3. ماذا يحدث إذا حاولت تعديل كائن متداخل في نسخة سطحية؟

سوف يتأثر الكائن الأصلي أيضًا.

4. هل من الأفضل دائمًا استخدام النسخة العميقة لتجنب المشاكل؟

ليس بالضرورة، فقط عند العمل مع هياكل البيانات المعقدة.

5. ما هي المزايا التي يتمتع بها StructuredClone()‎ مقارنة بطرق النسخ العميق الأخرى في JavaScript؟

إنه أصلي، ويدعم الهياكل الدائرية وأكثر كفاءة من JSON.parse(JSON.stringify())، بالإضافة إلى السماح بنقل القيم بالكامل من كائن إلى آخر.


الأخطاء عند استخدام النسخ السطحية بدلاً من النسخ العميقة أكثر شيوعًا مما تعتقد! آمل أن يساعدك هذا الدليل الصغير في تجنب أي مشاكل عند نسخ البيانات.

أخبرني في التعليقات، هل كنت تعرف بالفعل عن النسخ العميقة والسطحية وهل واجهتك مشكلة بسببها من قبل؟


Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python
دفتر BYXN؟ | المكدس الفرعي

دفتر ملاحظاتي العام! ؟؟؟ انقر لقراءة دفتر ملاحظات BYXN؟، منشور Substack. تم إطلاقه منذ 17 يومًا.

bhyxen.substack.com Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python
تصوير محمد رحماني على Unsplash

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/bhyxen/shallow-copy-vs-deep-copy-que-son-realmente-ejemplos-con-javascript-y-python-10ja?1 إذا كان هناك أي انتهاك يرجى الاتصال بـ Study_golang @163.comdelete
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3