2016-08-21 11 views
11

के भीतर एक सूची अपडेट करना मैं केवल दुभाषिया में चारों ओर घूम रहा था और कुछ ऐसा नहीं चला जो मुझे समझ में नहीं आया। जब मैं एक सूची के साथ एक सूची के रूप में एक tuple बनाते हैं और फिर उस सूची को अद्यतन करने का प्रयास करें, तो कुछ अजीब होता है। उदाहरण के लिए, जब मैं रन:एक tuple

tup = (1,2,3,[4,5]) 
tup[3] += [6] 

मैं:

TypeError: 'tuple' object does not support item assignment 

कौन सा है मैं वास्तव में क्या उम्मीद।

>>> tup 
(1, 2, 3, [4, 5, 6]) 

तो सूची वास्तव में अद्यतन किया गया था, भले ही अजगर एक अपवाद दिए: हालांकि फिर जब मैं फिर से टपल संदर्भ, मैं मिलता है। वह कैसे काम करता है? मैं एक ऐसे परिदृश्य की कल्पना नहीं कर सकता जहां मैं वास्तव में ऐसा कुछ करना चाहता हूं, लेकिन मैं अभी भी समझना चाहता हूं कि क्या हो रहा है। धन्यवाद।

उत्तर

27

यह वास्तव में Python docs में प्रलेखित है।

संपादित करें: यहां सारांश है ताकि यह एक और पूर्ण उत्तर हो।

  1. जब हम += उपयोग करते हैं, अजगर, मद पर __iadd__ जादू प्रणाली को बुलाती है तो उसके बाद वाले आइटम काम में वापसी मान का उपयोग करता है।
  2. सूचियों के लिए, __iadd__ सूची में extend पर कॉल करने और फिर सूची को वापस करने के बराबर है।
  3. इसलिए, जब हम tup[3] += [6] कहते हैं, यह करने के लिए बराबर है:

    result = tup[3].extend([6]) 
    tup[3] = result 
    
  4. पहली पंक्ति extend बुला में सफल होता है:

    result = tup[3].__iadd__([6]) 
    tup[3] = result 
    
  5. # 2 से, हम इस निर्धारित कर सकते हैं के बराबर है सूची में, और चूंकि सूची उत्परिवर्तनीय है, यह अद्यतन करता है। हालांकि, बाद में असाइनमेंट विफल रहता है क्योंकि ट्यूपल्स अपरिवर्तनीय हैं, और त्रुटि फेंकता है।

+2

मुझे लगता है कि इसका उत्तर उस अतिरिक्त से लाभान्वित होगा क्योंकि यह विस्तार सिर्फ 'tup [3] नहीं है .__ iadd __ ([6]) '; यह 'tup [3] = tup [3] है .__ iadd __ ([6])'। यह केवल सुविधाजनक है कि 'list .__ iadd__' वही ऑब्जेक्ट देता है जो यह उत्परिवर्तित हो रहा है। – zondo

+0

दस्तावेज़ों के लिंक के लिए धन्यवाद! यह एक बड़ी मदद है। –

+0

धन्यवाद, मैंने इसे दस्तावेज़ों में नहीं पकड़ा। इसलिए यह सुनिश्चित करने के लिए कि मैं इस अधिकार को समझता हूं, मूल रूप से मेरे उदाहरण में सूची अपडेट की गई है क्योंकि मैं बस tup [3] .__ iadd __ ([6]) कर रहा हूं और फिर पायथन टुपल पर आइटम असाइनमेंट (और विफल रहता है) प्रयास करता है? तो मुझे अपवाद मिलता है कि यह असफल रहा, लेकिन उस बिंदु तक हमने सूची को पहले से ही अपडेट कर दिया है? –

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