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

كيفية التقاط المتغيرات بشكل صحيح في وظائف Lambda في الحلقات؟

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

How to Properly Capture Variables in Lambda Functions in Loops?

التقاط المتغيرات في وظائف Lambda

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

ضع في اعتبارك الكود المعطى:

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

هنا، تلتقط دالة lambda قيمة m من النطاق المحيط. ومع ذلك، بعد انتهاء الحلقة، يحتفظ m بالقيمة الأخيرة ("mi"). عندما يتم استدعاء كل دالة لامدا، فإنها تشير إلى متغير m المشترك، مما يؤدي إلى إخراج "mi" عدة مرات.

للتغلب على هذه المشكلة والتأكد من أن كل لامدا تلتقط قيمة مميزة لـ m، استخدم تقنية تسمى " الوسيطات الافتراضية":

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

بجعل m معلمة افتراضية بنفس الاسم، تلتقط كل lambda مثيلها الخاص للمتغير، مما يضمن الإخراج المتوقع:

"فعل"
"إعادة"
"مي"

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

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

Copyright© 2022 湘ICP备2022001581号-3