for
पाश तो क्या एक वेनिला असाइनमेंट की एलएचएस पर काम करता है के साथ काम करना चाहिए असाइनमेंट के मानक नियमों का पालन करती for
:
बदले में प्रत्येक आइटम मानक नियमों का उपयोग कर लक्ष्य सूची में असाइन किया गया है कार्य
के लिए for
निर्माण बस लक्ष्य जो आपके नमूना कोड के मामले में STORE_SUBSCR
है निर्दिष्ट करने के लिए अंतर्निहित तंत्र सम्मन:
+०१२३५१६४१०
>>> foo = [42]
>>> k = {'c': 'd'}
>>> dis.dis('for k["e"] in foo: pass')
1 0 SETUP_LOOP 16 (to 18)
2 LOAD_NAME 0 (foo)
4 GET_ITER
>> 6 FOR_ITER 8 (to 16)
8 LOAD_NAME 1 (k)
10 LOAD_CONST 0 ('e')
12 STORE_SUBSCR <--------------------
14 JUMP_ABSOLUTE 6
>> 16 POP_BLOCK
>> 18 LOAD_CONST 1 (None)
20 RETURN_VALUE
लेकिन मेरे आश्चर्य करने के लिए, यह एक सिंटैक्स त्रुटि
जाहिर है, जो कुछ भी जैसे कि निम्न एक नियमित रूप से काम में काम करता है नहीं था:
पूर्ण टुकड़ा काम:
>>> for [][:] in []:
... pass
...
>>>
सूची सदस्यता
>>> for [2][0] in [42]:
... pass
...
>>>
शब्दकोश सदस्यता आदि मान्य उम्मीदवार लक्ष्य, अकेला अपवाद एक श्रृंखलित काम होने के साथ हो सकता है; हालांकि, मैं चुपचाप सोचता हूं कि चेनिंग करने के लिए कोई गंदा वाक्यविन्यास पका सकता है।
मैं केवल एक पहचानकर्ता और पहचानकर्ता
मैं एक लक्ष्य के रूप में एक शब्दकोश कुंजी के लिए एक अच्छा उपयोग के मामले के बारे में सोच नहीं कर सकते हैं की tuples उम्मीद करेंगे। इसके अलावा, यह for
खंड में लक्ष्य के रूप में उपयोग करने के बजाय, लूप बॉडी में शब्दकोश कुंजी असाइनमेंट करने के लिए और अधिक पठनीय है।
हालांकि, खोल विस्तारित (अजगर 3) जो नियमित रूप से कार्य में बहुत उपयोगी है भी पाश के लिए एक में समान रूप से काम आता है:
>>> lst = [[1, '', '', 3], [3, '', '', 6]]
>>> for x, *y, z in lst:
... print(x,y,z)
...
1 ['', ''] 3
3 ['', ''] 6
विभिन्न लक्ष्यों यहां भी बुलाया जाता है करने के लिए असाइन करने के लिए इसी तंत्र; कई STORE_NAME
रों:
>>> dis.dis('for x, *y, z in lst: pass')
1 0 SETUP_LOOP 20 (to 22)
2 LOAD_NAME 0 (lst)
4 GET_ITER
>> 6 FOR_ITER 12 (to 20)
8 EXTENDED_ARG 1
10 UNPACK_EX 257
12 STORE_NAME 1 (x) <-----
14 STORE_NAME 2 (y) <-----
16 STORE_NAME 3 (z) <-----
18 JUMP_ABSOLUTE 6
>> 20 POP_BLOCK
>> 22 LOAD_CONST 0 (None)
24 RETURN_VALUE
पता चलता है कि एक for
मुश्किल से सरल काम क्रमिक निष्पादित बयान है चला जाता है।
इसे अनुमति देने के लिए उपयोगी नहीं होना चाहिए। एक शब्दकोश में एक कुंजी मान मान्य पहचानकर्ता है। चूंकि नामस्थान हैं, स्वयं, शब्दकोश, इसे बदलने के लिए बहुत सारे पायथन इंटर्नल्स को बदलने की आवश्यकता होगी। और कुछ ऐसा ठीक करने के लिए जो केवल एक मुद्दा है यदि आप आकस्मिक कोड लिखते हैं जिसके परिणामस्वरूप कोई त्रुटि नहीं होती है। –
@AlanLeuthard मैं देख रहा हूं कि आप क्या कह रहे हैं (और आपका उत्तर अच्छी तरह से बाहर निकलता है) लेकिन अधिक सटीक होने के लिए, एक ['पहचानकर्ता '] (https://docs.python.org/2/reference/lexical_analysis.html# व्याकरण-टोकन-पहचानकर्ता) केवल अक्षरों और अंकों का अनुक्रम हो सकता है, यानि एक वास्तविक चर * नाम * की बजाय किसी अन्य असाइन करने योग्य अभिव्यक्ति की बजाय ['सदस्यता'] (https://docs.python.org/2/ संदर्भ/expressions.html # व्याकरण टोकन-सदस्यता)। – jtbandes
हाँ। पहचानकर्ता के बजाय लक्ष्य कहा जाना चाहिए –