मैं Twitter पर इस अजगर का टुकड़ा देखा और काफी उत्पादन से उलझन में था:अजगर असाइनमेंट ऑपरेटर पूर्वता - (क, ख) = एक [ख] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
यहाँ क्या हो रहा है ?
मैं Twitter पर इस अजगर का टुकड़ा देखा और काफी उत्पादन से उलझन में था:अजगर असाइनमेंट ऑपरेटर पूर्वता - (क, ख) = एक [ख] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
यहाँ क्या हो रहा है ?
Assignment statements documentation से:
एक काम बयान अभिव्यक्ति सूची (याद रखें कि यह एक भी अभिव्यक्ति या एक अल्पविराम से अलग किए, बाद एक टपल उपज हो सकता है) का मूल्यांकन करता है और करने के लिए एकल जिसके परिणामस्वरूप वस्तु प्रदान करती है लक्ष्य सूची में से प्रत्येक, बाएं से दाएं।
आपके पास दो असाइनमेंट लक्ष्य सूचियां हैं; a, b
, और a[b]
, मान {}, 5
को उन दो लक्ष्यों को बाएं से दाएं को सौंपा गया है।
पहले {}, 5
टुपल a, b
पर अनपॅक किया गया है। अब आपके पास a = {}
और b = 5
है। ध्यान दें कि {}
उत्परिवर्तनीय है।
इसके बाद आप a[b]
, जहां a
शब्दकोश में मूल्यांकन करती है और b
5
का मूल्यांकन करने के लिए एक ही शब्दकोश और पूर्णांक असाइन करते हैं, तो आप टपल ({}, 5)
की कुंजी 5
शब्दकोश में सेट कर रहे हैं एक परिपत्र संदर्भ बनाने। {...}
इस प्रकार एक ही ऑब्जेक्ट को संदर्भित करता है कि a
पहले से ही संदर्भित है।
काम बाएं से दाएं जगह लेता है क्योंकि आप इस नीचे करने के लिए तोड़ सकते हैं:
a, b = {}, 5
a[b] = a, b
तो a[b][0]
a
रूप में एक ही वस्तु है:
>>> a, b = {}, 5
>>> a[b] = a, b
>>> a
{5: ({...}, 5)}
>>> a[b][0] is a
True
हम्म कि अजगर के लिए आश्चर्यजनक रूप से unintuitive है! मैं उम्मीद करता हूं कि यह दाएं से बाएं से कैस्केड हो और इस प्रकार 'ए [बी] = ए, बी = {}, 5' काम करने के साथ' नेमरर' 'फेंक दें। – Claudiu
उत्कृष्ट जवाब। मैंने यह पता लगाया कि मैंने पोस्ट करने से पहले क्या चल रहा था और प्रतिक्रिया पोस्ट करने की योजना बना रहा था, लेकिन आपने इसका उत्तर दिया। इसके अलावा, 'ए [बी] [0] के लिए +1 एक पंक्ति है। – Andrew
अच्छा जवाब! लेकिन दस्तावेज़ कहते हैं कि _ एकल परिणामस्वरूप ऑब्जेक्ट ** को प्रत्येक लक्ष्य सूचियों में बाएं से दाएं_ तक पहुंचाता है, इसलिए यह 'ए, बी = {}, 5 के बराबर नहीं होना चाहिए; एक [बी] = {}, 5'? –