आप पाश कुछ इस तरह लेखन से बचने के लिए:
lis.append(lambda: 0)
lis.append(lambda: 1)
lis.append(lambda: 2)
आपका इरादा लैम्ब्डा कार्यों कि निरंतर पूर्णांकों लौट लिखने के लिए है। लेकिन आप को परिभाषित करने और उस वस्तु i
लौटा रहा है एक समारोह जोड़कर कर रहे हैं। इस प्रकार 3 संलग्न कार्य समान हैं।
कार्यों के पीछे बाइट कोड बनाया रिटर्न i
:
In [22]: import dis
In [25]: dis.dis(lis[0])
3 0 LOAD_GLOBAL 0 (i)
3 RETURN_VALUE
In [26]: dis.dis(lis[1])
3 0 LOAD_GLOBAL 0 (i)
3 RETURN_VALUE
In [27]: dis.dis(lis[2])
3 0 LOAD_GLOBAL 0 (i)
3 RETURN_VALUE
कॉलिंग उन कार्यों में से किसी i
के नवीनतम मान अपने नमूना कोड में 2
रिटर्न:
In [28]: lis[0]()
Out[28]: 2
यदि आप हटाना
In [29]: del i
In [30]: lis[0]()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-30-c9e334d64652> in <module>()
----> 1 lis[0]()
<ipython-input-18-15df6d11323a> in <lambda>()
1 lis = []
2 for i in range(3):
----> 3 lis.append(lambda: i)
NameError: global name 'i' is not defined
:
i
वस्तु, आपको कोई त्रुटि मिलती
In [31]: lis = []
...: for i in range(3):
...: exec 'lis.append(lambda: {})'.format(i)
...:
निम्न परिणाम के साथ
:
एक समाधान स्थिरांक आप की जरूरत के साथ कोड लिखने के लिए पाश का उपयोग कर रखने के लिए और वास्तव में उस कोड को चलाने हो सकता है
In [44]: lis[0]()
Out[44]: 0
In [45]: lis[1]()
Out[45]: 1
In [46]: dis.dis(lis[0])
1 0 LOAD_CONST 1 (0)
3 RETURN_VALUE
In [47]: dis.dis(lis[1])
1 0 LOAD_CONST 1 (1)
3 RETURN_VALUE
यह एक मानक प्रश्न है। जैसे http://stackoverflow.com/questions/1107210/python-lambda-problems, http://stackoverflow.com/questions/1924214/python-lambdas-and-scoping। कई, * कई * अधिक। –
संबंधित: [? क्यों मानचित्र के परिणाम() और सूची समझ अलग हैं] (http://stackoverflow.com/questions/139819/why-results-of-map-and-list-comprehension-are-different) – jfs