2012-05-01 8 views
15

मैं बस कुछ ऐसी चीज में आया जो काफी अजीब था।पाइथन टुपल के भीतर किसी सूची का + = टाइप टाइपर क्यों बढ़ाता है लेकिन सूची को संशोधित करता है?

>>> t = ([],) 
>>> t[0].append('hello') 
>>> t 
(['hello'],) 
>>> t[0] += ['world'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 
>>> t 
(['hello', 'world'],) 

ऐसा क्यों है TypeError बढ़ा है और अभी तक listtuple अंदर बदलते हैं?

+1

मुझे लगता है कि आपको देखना होगा कि '+ = वास्तव में कैसे लागू किया गया है। ऐसा लगता है कि यह वास्तव में एक नई सूची नहीं बनाता है, यह सूची में जगह बदलता है, यह '+' भाग है। फिर आपके पास असाइनमेंट है, लेकिन चूंकि टुपल्स अपरिवर्तनीय हैं, इसलिए इसकी अनुमति नहीं है। –

+0

@ फ़ेलिक्सक्लिंग + = संलग्न करने के समान काम करता है(), यानी सूची का आईडी() समान रहता है। –

+0

यह भी ध्यान रखें कि हैश को टुपल करने में सक्षम होने के लिए, इसके सभी घटक भाग भी हर्षनीय होना चाहिए। – mgilson

उत्तर

19

मैं टिप्पणी में उल्लेख शुरू कर दिया, += वास्तव में यथा-स्थान सूची को संशोधित करता है और उसके बाद टपल में प्रथम स्थान के लिए परिणाम आवंटित करने के लिए कोशिश करता है। से data model documentation:

इन विधियों संवर्धित गणित कार्य (लागू करने के लिए कहा जाता है + =, - =, =,/=, // =,% =, * =, < < =, >> =, & =,^=, | =)। इन विधियों को ऑपरेशन में जगह (स्वयं को संशोधित करने) का प्रयास करना चाहिए और परिणाम लौटा देना चाहिए (जो हो सकता है, लेकिन स्वयं नहीं होना चाहिए)। ,

t[0].extend(['world']); 
t[0] = t[0]; 

तो सूची को संशोधित करने में जगह समस्या (1. कदम) नहीं है, क्योंकि सूचियों अस्थायी हैं, लेकिन परिणाम वापस बताए करने के लिए टपल नहीं है:

+= इसलिए के बराबर है वैध (2. चरण), और वह जगह है जहां त्रुटि फेंक दी गई है।

+2

और केवल स्पष्टीकरण के लिए, मौजूदा सूची आरएचएस से सूची के साथ मिलकर मिल गई, लेकिन टुपल को असाइनमेंट विफल रहा, लेकिन यह सूची ऑब्जेक्ट का संदर्भ अभी भी बरकरार रहा है। यही कारण है कि आप सूची को अद्यतन करते हैं और 'टाइपरर'' को बढ़ाने वाले टुपल को देखते हैं। –

+0

समझ गया। यह अब समझ में आता है। धन्यवाद। – satran

+0

@ फ़ेलिक्स क्लिंग लेकिन सूची के + = आईडी() के बाद भी एक ही रहता है, लेकिन सूची के आईडी() में परिवर्तन होता है यदि हम इसे इस तरह संशोधित करते हैं, उदाहरण के लिए x [0] = x [0] + ['list '], जहां एक्स सूचियों की एक सूची है। –

संबंधित मुद्दे