python - []=(),()=(), और{}=() 'असाइनमेंट'




python-3.x python-2.7 (3)

असाइनमेंट स्टेटमेंट का बायां हाथ एक अभिव्यक्ति नहीं है , यह एक लक्षित सूची है । संक्षिप्त सारांश:

  • यदि लक्ष्य सूची एक पहचानकर्ता है, तो नाम सिर्फ दायीं ओर बाध्य है।
  • यदि लक्ष्य सूची लक्ष्य की कॉमा सेपरेटेड सूची है, तो दाईं ओर की ओर अनपॅक किया गया है और अनपॅक किए गए तत्व सूचीबद्ध लक्ष्यों को असाइन किए गए हैं।
  • एक लक्षित सूची कोष्ठक या वर्ग ब्रैकेट में संलग्न किया जा सकता है। विशेष रूप से, यह आपके उदाहरणों में दिखाई देने वाली खाली लक्ष्य सूचियां बनाने की अनुमति देता है।

यह बताता है कि [] और () असाइनमेंट के लिए वैध बाएं हाथ के पक्ष क्यों हैं: वे वैध लक्ष्य सूचियां हैं। हालांकि, {} नहीं है, क्योंकि यह वैध लक्ष्य सूची नहीं है।

बेशक, {} एक लक्ष्य का हिस्सा हो सकता है, उदाहरण के लिए सदस्यता के प्राथमिक के रूप में: {}[()] = 0 मान्य पायथन (लेकिन बिल्कुल बेकार है)।

मैं पाइथन 3 में निम्नलिखित खोजने के लिए हैरान था, पहले दो ने कुछ भी नहीं उठाया:

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

पायथन 2.7 में, केवल पहला व्यक्ति कुछ भी नहीं उठाता है:

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

यहाँ क्या हो रहा है? तब कोई भी त्रुटियों को उठा नहीं रहा है? और क्यों () = () संभवतः पाइथन 3 में मान्य होने के लिए जोड़ा गया था?

* ध्यान दें, आप किसी भी खाली इटेरबल (जैसे [] = set() ) के साथ दाईं ओर की ओर प्रतिस्थापित कर सकते हैं, मैं बस चित्रण के लिए एक खाली ट्यूपल चुनता हूं


एक पुनरावर्तनीय से चर आवंटित करने का एक तरीका है:

>>> a, b = iter((1, 2))
>>> a
1
>>> b
2
>>> [c, d] = iter((4, 5))
>>> c
4
>>> d
5

[] = … और () = … असाइनमेंट इनके विशेष मामले प्रतीत होते हैं।


Issue23275 अनुसार, ये मूल रूप से quirks हैं जो कोई वास्तविक नुकसान नहीं बल्कि कोई उपयोगिता भी है। ध्यान दें कि [] = () list अक्षर को परिवर्तित नहीं करता है:

>>> [] = ()
>>> type([])
<class 'list'>

[] = x कथन मूल रूप से जोर देते हैं कि x पुनरावर्तनीय है और वह x खाली है (हालांकि कोई भी इस तरह उनका उपयोग करने की अनुशंसा नहीं करेगा), उदाहरण के लिए

>>> [] = (1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> [] = (1,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

जैसा कि जॉन वाई ने टिप्पणी की है [] = () को असाइनमेंट के रूप में नहीं बल्कि पाइथन के पुनरावर्तनीय अनपॅकिंग वाक्यविन्यास के अनुरूप होने का एक तरीका है।

ArrowCase टिप्पणियों के रूप में, यह वाक्यविन्यास भी कई असाइनमेंट तक फैलता है:

>>> a = [] = ()
>>> a
()

एकाधिक असाइनमेंट के सीपीथॉन बाइटकोड को देखते हुए यह दर्शाता है कि यह ऑपरेशन UNPACK_SEQUENCE निर्देश का उपयोग करते हुए सामान्य UNPACK_SEQUENCE वाक्यविन्यास के समान हैं:

>>> dis.dis('a = [] = ()')
  1           0 BUILD_TUPLE              0
              2 DUP_TOP
              4 STORE_NAME               0 (a)
              6 UNPACK_SEQUENCE          0
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> dis.dis('[a, b] = (1, 2)')
  1           0 LOAD_CONST               3 ((1, 2))
              2 UNPACK_SEQUENCE          2
              4 STORE_NAME               0 (a)
              6 STORE_NAME               1 (b)
              8 LOAD_CONST               2 (None)
             10 RETURN_VALUE

एक ही समस्या 23275 बताती है कि () = () को समेकन के लिए पायथन 3 पर वैध वाक्यविन्यास के रूप में जोड़ा गया था। यह निर्णय लिया गया था कि [] = () को हटाकर कोड को बेकार कर दिया जाएगा, क्योंकि इससे कोई नुकसान नहीं होता है और यह अस्थिर अनपॅकिंग तर्क के साथ फिट बैठता है। {} = () अभी भी अमान्य है क्योंकि अनपॅकिंग सिंटैक्स इस संदर्भ में ब्रेसिज़ के साथ समझ में नहीं आता है।

यदि कोई सोच रहा है, तो list() = () जैसे सिंटैक्स बस वाक्य रचनात्मक रूप से अमान्य है, क्योंकि आप कभी भी फ़ंक्शन कॉल को असाइन नहीं कर सकते हैं।





python-2.7