التقاط المتغيرات في وظائف 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 مثيلها الخاص للمتغير، مما يضمن الإخراج المتوقع:
"فعل"
"إعادة"
"مي"
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3