افهم كائنات Python
تتبّع المراجع والنسخ في Python
لماذا قد يظهر التعديل الذي تجريه عبر b عند الوصول إلى القائمة عبر a أيضًا؟ تتبّع المراجع بين المتغيرات والقوائم، ثم قارن الإسناد والنسخ السطحي والنسخ العميق.
اختر أحد أزرار الأمثلة الثلاثة، ثم اضغط «الخطوة التالية» أسفل النتيجة مباشرة. تجمع كل خطوة تعليمة Python وشرحها وقيمتي a وb قبل التعليمة وبعدها. تشرح أزرار ? وظيفة العناصر، ويمكنك توسيع اللوحات أسفل المثال لعرض مخطط المراجع والكود الكامل.
الأداة مجانية ولا تتطلب التسجيل. الحالات المعروضة ناتجة عن تنفيذ كود Python والتحقّق منه. تتنقّل الأزرار بين هذه الأمثلة المعدّة مسبقًا، ولا تشغّل كودًا حرًّا.
فهم النسخ في Python والمراجع
المتغير في Python اسم مرتبط بكائن. ويتيح المرجع الوصول إلى ذلك الكائن. يربط كل سهم في المخطط اسمًا أو عنصرًا من قائمة بالقائمة التي يشير إليها.
الإسناد باستخدام b = a
يشير الاسمان إلى القائمة نفسها. لا ينشئ الإسناد نسخة جديدة. يظهر تعديل قائمة فرعية أو إضافة عنصر إلى القائمة الرئيسية عند الوصول إليها عبر أي من الاسمين.
النسخ السطحي باستخدام a.copy()
تكون القائمة الرئيسية جديدة، لكن عناصرها قد تبقى مراجع إلى الكائنات نفسها. هنا تكون القوائم الفرعية مشتركة، لذلك يغيّر تعديل محتواها ما نراه عبر a أيضًا.
النسخ العميق باستخدام deepcopy(a)
في هذا المثال، تُنشأ قائمة رئيسية وقوائم فرعية جديدة للمتغير b. تساوي قيمها في البداية قيم القوائم في a، لكن مراجعها مختلفة. لا تظهر الأعداد الصحيحة في المخطط ككائنات منفصلة.
القيم 23 و19 و24 مأخوذة من الصفوف الثلاثة الأولى للعمود Hours_Studied في بيانات Student Performance Factors. جُمعت في قائمتين فرعيتين لدراسة المراجع. لا تعدّل الأمثلة الملف الأصلي. مصدر القيم: Student Performance Factors
ما الذي يوضحه المخطط؟
تُستخدم الرموز L1 وL2… لتمييز القوائم في المخطط، وليست عناوين فعلية في الذاكرة. يقارن is هوية الكائنات، بينما يقارن == قيمها هنا. تعرض العودة إلى الخلف حالة سابقة من المثال. يقتصر المخطط على قوائم الأعداد المعروضة؛ ولا يصف كل سلوك ممكن للدالة deepcopy مع الكائنات المخصّصة.
معاينة المخطط
