تقنية

deepcopy في بايثون: هل يشير المرجع الضعيف إلى النسخة؟

own=Node(4); weak=ref(own); clone=deepcopy([own,weak]); clone[0] is own:False; clone[1] is weak:True; clone[1]() is own:True
هوية المرجع.

نسخ القائمة لا يعيد توجيه مرجعها الضعيف في مثالنا. [1] [2]

الخلاصة السريعة

لا؛ المرجع يبقى إلى الأصل هنا. [1] [2]

  • نسخ القائمة لا يعيد توجيه مرجعها الضعيف في مثالنا. [1] [2]
  • على CPython 3.12.14، نضع كائن Node بقيمة n=4 وweak=ref(own) في قائمة، ثم ننسخها عميقًا. [1] [2]
  • clone[0] تختلف عن own في الهوية؛ clone[1] هي weak نفسها، وclone[1]() تعيد own. [1] [2]
  • مسار weakref.ref يعيد المرجع نفسه. بعد own.n=9، قيمة النسخة 4 وقراءة المرجع 9. [1] [2]
  • إنشاء ref(clone[0]) صراحة يعيد مرجعًا إلى النسخة بقيمة 4. الأصل والنسخة حيان؛ لا نختبر وكلاء أو حذفًا أو نسخًا مخصصًا. [1] [2]

الوجهة الأصلية

نسخ القائمة لا يعيد توجيه مرجعها الضعيف في مثالنا. [1] [2]

قائمة المثال

على CPython 3.12.14، نضع كائن Node بقيمة n=4 وweak=ref(own) في قائمة، ثم ننسخها عميقًا. [1] [2]

الهوية

clone[0] تختلف عن own في الهوية؛ clone[1] هي weak نفسها، وclone[1]() تعيد own. [1] [2]

from copy import deepcopy from weakref import ref class Node: def __init__(self,n):self.n=n own=Node(4);weak=ref(own) clone=deepcopy([own,weak]) print(clone[0] is own,clone[1] is weak) print(clone[1]() is own) [1] [2]

After own.n=9; existing clone; clone[0].n:4; clone[1]().n:9; control=ref(clone[0]); control().n:4
أثر التعديل.

التعديل والتحكم

مسار weakref.ref يعيد المرجع نفسه. بعد own.n=9، قيمة النسخة 4 وقراءة المرجع 9. [1] [2]

own.n=9 print(clone[0].n,clone[1]().n) control=ref(clone[0]) print(control() is clone[0],control().n) [1] [2]

إنشاء ref(clone[0]) صراحة يعيد مرجعًا إلى النسخة بقيمة 4. الأصل والنسخة حيان؛ لا نختبر وكلاء أو حذفًا أو نسخًا مخصصًا. [1] [2]

المراجع

  1. Python weakref
  2. CPython copy

للتوسع: لغات البرمجة.

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