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

كيفية تجنب السلوك غير المتوقع في نطاق وظائف Lambda والمعلمات في الحلقات؟

نشر في 2025-03-24
تصفح:337

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops?

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

المشكلة

طباعة MSG # نهج غير صحيح باستخدام ايتراتور Funclist = [] لـ M in ('do' ، 're' ، 'mi'): funclist.append (Lambda: Callback (M)) # النهج الصحيح إنشاء واحدة في وقت واحد Funclist = [] funclist.append (lambda: callback ('do')) funclist.append (Lambda: Callback ('re')) funclist.append (Lambda: Callback ('Mi')) # تنفيذ وظائف رد الاتصال لـ F في Funclist: f ()

عند تنفيذها ، يطبع الكود بشكل غير متوقع: mi مي مي يفعل يكرر mi

بدلاً من الإخراج المتوقع:

def callback(msg):
    print msg

# Incorrect approach using an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Correct approach creating one at a time
funcList = []
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))

# Execute the callback functions
for f in funcList:
    f()

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

mi
mi
mi
do
re
mi

الآن ، داخل كل وظيفة lambda ، يتم التقاط m كمتغير محلي ، ويتم الحفاظ على قيمته عند اكتمال الحلقة. وبالتالي ، عند تنفيذ وظائف رد الاتصال ، فإنها تطبع القيم الصحيحة ، مما يؤدي إلى الإخراج المتوقع.

بيان الافراج يتم استنساخ هذه المقالة في: 1729329977 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3