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