सूची comprehensions उनके कोड समारोह जहां वे इस्तेमाल कर रहे हैं में सीधे रखा है, इस तरह:पाइथन 2 में जनरेटर अभिव्यक्तियों और निर्देश/सेट समझें सूची समझ के विपरीत एक नेस्टेड फ़ंक्शन का उपयोग क्यों करती हैं?
>>> dis.dis((lambda: [a for b in c]))
1 0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (c)
6 GET_ITER
>> 7 FOR_ITER 12 (to 22)
10 STORE_FAST 0 (b)
13 LOAD_GLOBAL 1 (a)
16 LIST_APPEND 2
19 JUMP_ABSOLUTE 7
>> 22 RETURN_VALUE
जनरेटर भाव और dict/सेट comprehensions जबकि ज्यादातर एक अलग नेस्टेड समारोह में रखा जाता है, इस तरह:
>>> dis.dis((lambda: {a for b in c}))
1 0 LOAD_CONST 1 (<code object <setcomp> at 0x7ff41a3d59b0, file "<stdin>", line 1>)
3 MAKE_FUNCTION 0
6 LOAD_GLOBAL 0 (c)
9 GET_ITER
10 CALL_FUNCTION 1
13 RETURN_VALUE
>>> dis.dis((lambda: {a for b in c}).func_code.co_consts[1])
1 0 BUILD_SET 0
3 LOAD_FAST 0 (.0)
>> 6 FOR_ITER 12 (to 21)
9 STORE_FAST 1 (b)
12 LOAD_GLOBAL 0 (a)
15 SET_ADD 2
18 JUMP_ABSOLUTE 6
>> 21 RETURN_VALUE
पायथन 3 में, इन सभी को नेस्टेड फ़ंक्शन में रखा गया है।
कोड एक अलग नेस्टेड फ़ंक्शन में क्यों रखा गया है? मुझे बहुत समय पहले आसपास के दायरे में फैलाने वाली समझ और/या जीनेक्सप्रैर चर को ठीक करने के इच्छुक लोगों के बारे में कुछ पढ़ना याद रखना, क्या यह उस चीज़ के लिए ठीक था?
पाइथन 2 में शेष सूची से सूची समझ अलग-अलग क्यों लागू की जाती हैं? पिछली संगतता के कारण? (I सोचा मैंने जनरेटर अभिव्यक्तियों के परिचय के बाद बहुत सारे स्पिलिंग फिक्सिंग के बारे में बात सुनी, हालांकि, लेकिन शायद मैं वास्तव में पुरानी चर्चाओं या कुछ पढ़ रहा हूं)
यहां [एक लिंक] (https://mail.python.org/pipermail/python-3000/2007-March/006017.html) थ्रेड पर है जहां निक कोग्लान और जॉर्ज ब्रैंडल ने उन्हें इस तरह कार्यान्वित करने के लिए तर्क पर चर्चा की – Felipe