تقنية

copy_context في بايثون: هل تنعزل القائمة أيضًا؟

القائمة المشتركة بعد إضافة leaf
التعديل. [1] [2]

نسخ السياق لا ينسخ كل قيمة نسخًا عميقًا. [1] [2]

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

النسخة تشارك القائمة أولًا؛ إسناد قائمة جديدة يغير ربط النسخة وحدها. [1] [2]

  • بدأنا بقائمة bud في سياق مؤلف. [1] [2]
  • نسخناه بواسطة copy_context. [1] [2]
  • إضافة leaf تظهر في قائمة الأصل. [1] [2]
  • إسناد stone الجديد يظهر في النسخة فقط. [1] [2]
  • اختبرنا 3.12.14 دون خيوط أو مهام. [1] [2]

المثال

from contextvars import (
    ContextVar,Context,copy_context)
v=ContextVar('own')
def demo():
    v.set(['bud'])
    copied=copy_context()
    copied.run(
        lambda:v.get().append('leaf'))
    print(v.get())
    copied.run(v.set,['stone'])
    print(v.get(),copied[v])
Context().run(demo)

[1] [2]

قيمة وربط

المصدر هنا ينسخ السياق سطحيًا. تطبع الإضافة ['bud', 'leaf']، ثم يطبع الإسناد هذه القائمة و['stone']. تعديل الكائن المشترك يختلف عن استبدال الربط عبر set. [1] [2]

الأصل والنسخة بعد إسناد stone
الإسناد. [1] [2]

النطاق

نشغل المثال داخل Context() فارغ. لا نختبر النسخ العميق أو التزامن أو الأداء؛ مشاركة القيمة لا تعني أن كل إسناد ينتقل إلى الأصل. [1] [2]

المراجع

  1. Python 3.12: Context copies and run
  2. CPython 3.12.14: context.c
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

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