تقنية

namedtuple في بايثون: هل defaults تصنع قائمة لكل مثيل؟

namedtuple; defaults:[shared]; first.items is second.items:True; first.items.append("bud"); second.items:["bud"]
اشتراك.

القائمة الافتراضية مشتركة بين مثيلي namedtuple في مثالنا. [1] [2]

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

لا؛ المثيلان يستعملان القائمة نفسها. [1] [2]

  • القائمة الافتراضية مشتركة بين مثيلي namedtuple في مثالنا. [1] [2]
  • في CPython 3.12.14، shared=[]؛ ننشئ T بحقل items وdefaults=[shared]، ثم first=T() وsecond=T() دون وسيط. [1] [2]
  • first.items هي shared وهي second.items؛ إضافة "bud" عبر first تظهر في shared وsecond أيضًا. [1] [2]
  • المصنع يحول defaults إلى tuple ويربطها بـ__new__.__defaults__؛ في تجربتنا القيمة المرتبطة هي shared نفسها. [1] [2]
  • تحكم بصنف مستقل U بحقل items دون افتراضي؛ left=U([]) وright=U([]) يأخذان قائمتين جديدتين. بعد إضافة "bud" عبر left، تبقى right فارغة وتختلف هويتا القائمتين. [1] [2]

قائمة مشتركة

القائمة الافتراضية مشتركة بين مثيلي namedtuple في مثالنا. [1] [2]

المثيلان

في CPython 3.12.14، shared=[]؛ ننشئ T بحقل items وdefaults=[shared]، ثم first=T() وsecond=T() دون وسيط. [1] [2]

أثر الإضافة

first.items هي shared وهي second.items؛ إضافة "bud" عبر first تظهر في shared وsecond أيضًا. [1] [2]

from collections import namedtuple shared=[] T=namedtuple("T","items",defaults=[shared]) first=T();second=T() print(first.items is shared,first.items is second.items) first.items.append("bud") print(shared,second.items) [1] [2]

U:items; left=U([]); right=U([]); left.items.append("bud"); left.items:["bud"]; right.items:[]; same:False
استقلال.

قيم صريحة

المصنع يحول defaults إلى tuple ويربطها بـ__new__.__defaults__؛ في تجربتنا القيمة المرتبطة هي shared نفسها. [1] [2]

U=namedtuple("U","items") left=U([]);right=U([]) left.items.append("bud") print(left.items is right.items,left.items,right.items) [1] [2]

تحكم بصنف مستقل U بحقل items دون افتراضي؛ left=U([]) وright=U([]) يأخذان قائمتين جديدتين. بعد إضافة "bud" عبر left، تبقى right فارغة وتختلف هويتا القائمتين. [1] [2]

المراجع

  1. Python namedtuple
  2. CPython namedtuple

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

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