दिलचस्प पोस्ट
समान सर्वर पर अपाचे और नोड। जेएस सबमिट करें बटन के बिना प्रविष्ट कुंजी के साथ फ़ॉर्म सबमिट करें? बयान के लिए एन्हांस्ड कैसे कार्य करता है, और सरणी के लिए एक इटरेटर कैसे प्राप्त करें? JSON फ़ाइल से मान पार्स करते हैं? पाठ को आउटलाइन प्रभाव टिक टीएसी को पैर की अंगुली खेल को निर्धारित करने के लिए एल्गोरिदम उद्देश्य-सी में कस्टम प्रतिनिधि का उपयोग कैसे करें सी ++ विन्सॉक पी 2 पी एकाधिक उप-क्लास के लिए एकल स्टोरीबोर्ड यूआईवीइसीआई नियंत्रक का उपयोग कैसे करें बीएफएस द्वारा प्राप्त वास्तविक पथ को मैं कैसे प्राप्त करूं? क्या मेरे कंप्यूटर पर विजुअल स्टूडियो का संस्करण अजगर है? Ajax का उपयोग करते हुए एक ही रूप में डेटा और फाइल दोनों को अपलोड करना है? एंड्रॉइड: जीपीएस या इंटरनेट का उपयोग किए बिना उपयोगकर्ता का वर्तमान स्थान प्राप्त करें मैं एक जावा को सी # कनवर्टर कहां मिल सकता हूं? क्या स्ट्रैक्टस इंटरफेस लागू करने के लिए यह सुरक्षित है?

खाली सूची में क्यों असाइन नहीं किया जा रहा है (जैसे = "") एक त्रुटि?

अजगर 3.4 में, मैं टाइप कर रहा हूं

[] = "" 

और यह ठीक काम करता है, कोई अपवाद उठाया नहीं है। हालांकि निश्चित रूप से [] इसके बाद के बराबर नहीं है।

 [] = () 

भी ठीक काम करता है

 "" = [] 

एक अपवाद उठाता है जैसा कि उम्मीद है,

 () = "" 

एक अपवाद उठाता है, हालांकि उम्मीद है। तो क्या चल रहा है?

वेब के समाधान से एकत्रित समाधान "खाली सूची में क्यों असाइन नहीं किया जा रहा है (जैसे = "") एक त्रुटि?"

आप समानता के लिए तुलना नहीं कर रहे हैं आप असाइन कर रहे हैं।

पायथन आपको कई लक्ष्य को असाइन करने की अनुमति देता है:

 foo, bar = 1, 2 

क्रमशः foo और bar लिए दो मान निर्दिष्ट करता है। तुम्हारी ज़रूरत है एक अनुक्रम या दायें हाथ की तरफ, और बाईं ओर नामों की सूची या ट्यूपल।

जब तुम करोगे:

 [] = "" 

आपने रिक्त अनुक्रम (खाली स्ट्रिंग्स अभी भी अनुक्रमित हैं) नामों की एक खाली सूची में निर्दिष्ट किया है

यह अनिवार्य रूप से एक जैसा है:

 [foo, bar, baz] = "abc" 

जहां आप foo = "a" , bar = "b" और baz = "c" साथ समाप्त होते हैं, लेकिन कम वर्णों के साथ।

आप, हालांकि, एक स्ट्रिंग के लिए असाइन नहीं कर सकते हैं, इसलिए "" असाइनमेंट के बाएं हाथ पर कभी काम नहीं करता है और हमेशा एक सिंटैक्स त्रुटि होती है

असाइनमेंट बयानों को देखें:

एक असाइनमेंट स्टेटमेंट अभिव्यक्ति सूची का मूल्यांकन करता है (याद रखें कि यह एक एकल अभिव्यक्ति या अल्पविराम से विभाजित सूची हो सकती है, बाद में एक ट्यूपल प्रदान कर सकता है) और प्रत्येक लक्षित सूचियों में एकल परिणामी ऑब्जेक्ट को बाएं से दाएं को निर्दिष्ट करता है

तथा

लक्ष्य सूची में ऑब्जेक्ट का असाइनमेंट, वैकल्पिक रूप से कोष्ठक या चौकोर ब्रैकेट्स में संलग्न किया जाता है, निम्न प्रकार के रूप में पुनरावर्ती रूप से परिभाषित किया जाता है

जोर मेरा

यह पायथन खाली सूची के लिए वास्तव में एक बग का एक छोटा सा वाक्यविन्यास त्रुटि नहीं डालता है! आधिकारिक रूप से प्रलेखित व्याकरण एक खाली लक्ष्य सूची की अनुमति नहीं देता है, और रिक्त () आपको त्रुटि मिलती है बग 23275 ; यह एक हानिरहित बग माना जाता है:

शुरुआती बिंदु यह मान्यता दे रहा है कि यह बहुत लंबे समय के लिए रहा है और हानिरहित है।

यह भी देखें कि यह रिक्त सूची को असाइन करने के लिए वैध क्यों है, लेकिन रिक्त ट्यूपल के लिए नहीं?

यह दस्तावेज से असाइनमेंट विवरण अनुभाग नियमों का पालन करता है,

 assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) 

यदि target list की एक अल्पविराम से विभाजित सूची है: ऑब्जेक्ट समान वस्तुओं की संख्या के साथ एक योग्य होना चाहिए क्योंकि लक्ष्य सूची में लक्ष्य हैं, और आइटम को बायीं ओर से, इसी लक्ष्य तक निर्दिष्ट किया गया है।

ऑब्जेक्ट समान वस्तुओं की एक संख्या के साथ अनुक्रम होना चाहिए क्योंकि लक्ष्य सूची में लक्ष्य हैं, और वस्तुओं को बायीं ओर से, इसी लक्ष्य तक निर्दिष्ट किया गया है।

तो, जब आप कहते हैं

 [] = "" 

"" एक चलने योग्य (कोई भी वैध अजगर स्ट्रिंग एक आरती है) और यह सूची के तत्वों पर अनपेक्षित किया जा रहा है।

उदाहरण के लिए,

 >>> [a, b, c] = "123" >>> a, b, c ('1', '2', '3') 

चूंकि आपके पास एक रिक्त स्ट्रिंग है, और एक खाली सूची है, इसलिए अनपैक करने के लिए कुछ भी नहीं है। तो, कोई त्रुटि नहीं

लेकिन, यह प्रयास करें

 >>> [] = "1" Traceback (most recent call last): File "<input>", line 1, in <module> ValueError: too many values to unpack (expected 0) >>> [a] = "" Traceback (most recent call last): File "<input>", line 1, in <module> ValueError: need more than 0 values to unpack 

[] = "1" मामले में, आप चर की एक खाली सूची पर स्ट्रिंग "1" खोलने का प्रयास कर रहे हैं तो यह "बहुत सारे मूल्यों को खोलने के लिए (अपेक्षित 0)" के साथ शिकायत करता है

उसी तरह, [a] = "" मामले में, आपके पास एक खाली स्ट्रिंग है, इसलिए वाकई खोलने के लिए कुछ भी नहीं है, लेकिन आप इसे एक चर पर अनपेक कर रहे हैं, जो कि फिर से संभव नहीं है। यही कारण है कि यह शिकायत करता है कि "अनपैक करने के लिए 0 से अधिक मूल्यों की आवश्यकता"

इसके अलावा, जैसा आपने देखा,

 >>> [] = () 

भी कोई त्रुटि नहीं फेंकता है, क्योंकि () एक खाली ट्यूपल है

 >>> () () >>> type(()) <class 'tuple'> 

और जब यह एक खाली सूची पर खुलता है, तो उसे खोलने के लिए कुछ भी नहीं है। तो कोई त्रुटि नहीं


लेकिन, जब आप करते हैं

 >>> "" = [] File "<input>", line 1 SyntaxError: can't assign to literal >>> "" = () File "<input>", line 1 SyntaxError: can't assign to literal 

जैसा कि त्रुटि संदेश कहता है, आप स्ट्रिंग को अक्षरशः निर्दिष्ट करने का प्रयास कर रहे हैं कौन सा संभव नहीं है यही कारण है कि आपको त्रुटियां मिल रही हैं यह कहने की तरह है

 >>> 1 = "one" File "<input>", line 1 SyntaxError: can't assign to literal 

internals

आंतरिक रूप से, यह असाइनमेंट ऑपरेशन का अनुवाद UNPACK_SEQUENCE सेशन कोड में किया जाएगा,

 >>> dis(compile('[] = ""', "string", "exec")) 1 0 LOAD_CONST 0 ('') 3 UNPACK_SEQUENCE 0 6 LOAD_CONST 1 (None) 

यहां, क्योंकि स्ट्रिंग खाली है, UNPACK_SEQUENCE 0 बार UNPACK_SEQUENCE लेकिन जब आपके पास ऐसा कुछ है

 >>> dis(compile('[a, b, c] = "123"', "string", "exec")) 1 0 LOAD_CONST 0 ('123') 3 UNPACK_SEQUENCE 3 6 STORE_NAME 0 (a) 9 STORE_NAME 1 (b) 12 STORE_NAME 2 (c) 15 LOAD_CONST 1 (None) 18 RETURN_VALUE 

अनुक्रम 123 स्टैक में अनपेक्षित है, दाएं से बाएं ओर इसलिए, स्टैक का शीर्ष 1 होगा और अगले 2 हो जाएगा और अंतिम 3 होगा फिर यह स्टैक के ऊपर से बाएं हाथ की अभिव्यक्ति से एक को एक करके चर को आवंटित करता है।


बीटीडब्लू, पायथन में, इस तरह आप एक ही अभिव्यक्ति में कई असाइनमेंट कर सकते हैं। उदाहरण के लिए,

 a, b, c, d, e, f = u, v, w, x, y, z 

यह इसलिए काम करता है क्योंकि, दाएं हाथ के मूल्यों को ट्यूपल के निर्माण के लिए उपयोग किया जाता है और फिर यह बाएं हाथ की ओर मूल्यों पर अनपैक किया जाएगा।

 >>> dis(compile('a, b, c, d, e, f = u, v, w, x, y, z', "string", "exec")) 1 0 LOAD_NAME 0 (u) 3 LOAD_NAME 1 (v) 6 LOAD_NAME 2 (w) 9 LOAD_NAME 3 (x) 12 LOAD_NAME 4 (y) 15 LOAD_NAME 5 (z) 18 BUILD_TUPLE 6 21 UNPACK_SEQUENCE 6 24 STORE_NAME 6 (a) 27 STORE_NAME 7 (b) 30 STORE_NAME 8 (c) 33 STORE_NAME 9 (d) 36 STORE_NAME 10 (e) 39 STORE_NAME 11 (f) 42 LOAD_CONST 0 (None) 45 RETURN_VALUE 

लेकिन क्लासिक स्वैपिंग तकनीक a, b = b, a स्टैक के शीर्ष में तत्वों का रोटेशन का उपयोग करता है। यदि आपके पास केवल दो या तीन तत्व हैं तो उन्हें ROT_TWO और ROT_THREE के निर्माण के बजाय विशेष ROT_TWO और ROT_THREE निर्देशों के साथ व्यवहार किया जाता है।

 >>> dis(compile('a, b = b, a', "string", "exec")) 1 0 LOAD_NAME 0 (b) 3 LOAD_NAME 1 (a) 6 ROT_TWO 7 STORE_NAME 1 (a) 10 STORE_NAME 0 (b) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE