"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تجنب النتائج غير المتوقعة من تعديلات المعلمات في وظائف Lambda

كيفية تجنب النتائج غير المتوقعة من تعديلات المعلمات في وظائف Lambda

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

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

نطاق وظائف Lambda ومعلماتها

وظائف Lambda هي وظائف مجهولة يمكنها التقاط نطاق وظيفتها المتضمنة. وهذا يسمح لهم بالوصول إلى المتغيرات والمعلمات من النطاق الأصلي. ومع ذلك، يمكن أن يؤدي هذا السلوك أحيانًا إلى نتائج غير متوقعة عندما تستخدم وظائف لامدا معلمات تم تعديلها داخل الوظيفة المتضمنة.

لتوضيح المشكلة، ضع في اعتبارك الكود التالي:

def callback(msg):
    print(msg)

# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Calling the lambda functions
for f in funcList:
    f()

الإخراج المتوقع لهذا الكود هو:

do
re
mi

ومع ذلك، فإن الإخراج الفعلي هو:

mi
mi
mi

وذلك لأن وظائف لامدا تلتقط مرجعًا للمتغير m من النطاق المحيط. عندما ينفذ المكرِّر الحلقة، فإنه يعين القيمة "mi" إلى m في التكرار النهائي. ونتيجة لذلك، تحتوي جميع وظائف لامدا على إشارة إلى "mi" عند تنفيذها، على الرغم من تمرير قيم مختلفة إليها أثناء الإنشاء.

لحل هذه المشكلة، يمكنك التقاط قيمة m في وقت إنشاء دالة لامدا باستخدامها كقيمة افتراضية لمعلمة اختيارية:

for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))

يضمن هذا أن كل دالة lambda لديها حق الوصول إلى نسختها الخاصة من m، مما يلتقط القيمة التي تم تعيينها أثناء تكرار الحلقة. سيكون إخراج هذا الكود هو:

do
re
mi
بيان الافراج أعيد طبع هذه المقالة على: 1729329919 في حالة وجود أي مخالفة، يرجى التواصل مع [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3