"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يقوم `dict.fromkeys()` بإنشاء كائنات مشتركة قابلة للتغيير في بايثون؟

لماذا يقوم `dict.fromkeys()` بإنشاء كائنات مشتركة قابلة للتغيير في بايثون؟

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

 Why does `dict.fromkeys()` create shared mutable objects in Python?

إنشاء القاموس والكائنات القابلة للتغيير: السلوك المفاجئ مع fromkeys

عند إنشاء قواميس باستخدام dict.fromkeys () في بايثون، قد يحدث موقف غير متوقع تنشأ عندما يتم استخدام الكائنات القابلة للتغيير كقيم. خذ بعين الاعتبار المثال التالي:

xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)

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

في المقابل، تُظهر فهم القاموس في Python 3.2 سلوكًا مختلفًا:

xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)

هنا، يرتبط كل مفتاح بكائن قائمة مميز. إلحاق عنصر بالقائمة في الفهرس 0 لا يؤثر على القائمة في الفهرس 1.

لماذا الفرق؟

يمكن فهم سلوك fromkeys من خلال النظر في الكود المعادل التالي:

a = []
xs = dict.fromkeys(range(2), a)

يشير كل مفتاح في القاموس الناتج إلى نفس الكائن، مما يؤدي إلى التعديلات المشتركة التي تمت ملاحظتها.

لتحقيق السلوك المطلوب لـ كائنات مميزة قابلة للتغيير لكل مفتاح، استخدم فهم القاموس، أو بالنسبة لـ Python 2.6 والإصدارات الأقدم بدون فهم القاموس، استخدم dict() مع تعبير المولد:

xs = dict((i, []) for i in range(2))
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3