सूचियों पर पायथन अपेंड () बनाम + ऑपरेटर, ये अलग-अलग परिणाम क्यों देते हैं?


113

ये दो संचालन ( append()सम्मान +) अलग-अलग परिणाम क्यों देते हैं?

>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>> 

पिछले मामले में वास्तव में एक अनंत पुनरावृत्ति है। c[-1]और cसमान हैं। यह +ऑपरेशन के साथ अलग क्यों है ?


1
एक व्यवहार्य नए प्रश्न के लिए सभी उचित सम्मान के साथ: मैं इसे साफ रखने के लिए मूल प्रश्न पर वापस गया (प्रति थ्रेड 1 प्रश्न, SO FAQ देखें)। कृपया प्रत्येक उत्तर के नीचे टिप्पणी-सूत्र के अंदर एक नया प्रश्न पूछें या अनुवर्ती प्रश्न पूछें। नोट: आपके संपादन खो नहीं गए हैं, इतिहास पर क्लिक करें और आप इसे एक नए प्रश्न में कॉपी / पेस्ट कर सकते हैं।
हाबिल


ऐसा लगता है कि यह अलग एन्स देता है, लेकिन ऐसा नहीं है। यदि आप + ऑपरेटर का उपयोग करके एक मान जोड़ना चाहते हैं तो आपके पास ओ [साइन] का उपयोग करना होगा। c + = [c] आपको एपेंड के समान परिणाम देगा।
शरीफ चौधरी

@SharifChowdhury मुझे विश्वास है कि आपको एक ही परिणाम मिलेगा
भरोसा

जवाबों:


142

"क्यों" समझाने के लिए:

+आपरेशन कहते सरणी मूल सरणी तत्वों। array.appendआपरेशन सरणी (या किसी भी वस्तु) मूल सरणी के अंत में, में सम्मिलित करता है जो एक में परिणाम स्वयं के संदर्भ में उस स्थान (इसलिए अनंत प्रत्यावर्तन) में।

यहाँ अंतर यह है कि जब आप तत्व को जोड़ते हैं, तो आप एक सरणी जोड़ते हैं (यह दूसरों की तरह अतिभारित है, इस अध्याय को देखें ) विशिष्ट ऑपरेशन कार्य करता है । अपेंड-मेथड का शाब्दिक अर्थ है कि आप क्या पूछते हैं: ऑब्जेक्ट को उसके तत्वों को लेने के बजाय, दायीं ओर की ओर जोड़ दें जो आप इसे देते हैं (सरणी या कोई अन्य वस्तु)।

एक विकल्प

का प्रयोग करें extend()आप (के रूप में दूसरों को भी यहां से पता चला है) एक समारोह है कि + ऑपरेटर के समान कार्य करता है उपयोग करना चाहते हैं। इसके विपरीत करना बुद्धिमानी नहीं है: सूचियों के लिए + ऑपरेटर के साथ ऐप्पल की नकल करने की कोशिश करना ( क्यों पर मेरा पहले का लिंक देखें )।

थोड़ा इतिहास

मज़े के लिए, थोड़ा इतिहास: फरवरी 1993 में पायथन में सरणी मॉड्यूल का जन्म। यह आपको आश्चर्यचकित कर सकता है, लेकिन अनुक्रम और सूचियों के अस्तित्व में आने के बाद सरणियों को जोड़ा गया।


2
+1 क्योंकि मैं हमेशा सटीक जानकारी देता हूं। आधिकारिक डॉक्स के लिंक हमेशा एक प्लस होते हैं!

10
"क्यों" का एक और हिस्सा: समझदार लोग +सममित होने की उम्मीद करते हैं: सूची के साथ संक्षिप्त सूची।
बेनी चेर्नियाव्स्की-पास्किन

1
+1, अच्छी बात बेनी (जबकि मैं इसे "समझदार" के रूप में कहने के लिए "आरएच साइड पर ऑब्जेक्ट को एलएच साइड पर सरणी से जोड़ा जाता है" कह सकता हूं, लेकिन व्यक्तिगत रूप से वर्तमान व्यवहार को अधिक समझदार लगता है)।
हाबिल

यदि कोई तत्व सिंगल स्ट्रिंग है, जैसे s = 'शब्द', l = ['यह', 'है']। फिर l.append (s) और l + s समान होना चाहिए। क्या मैं सही हूँ?
user3512680

23

संयोजन ऑपरेटर +एक द्विआधारी इन्फ़िक्स ऑपरेटर, जो जब सूचियों के लिए आवेदन किया है, इसके दो ऑपरेंड में से प्रत्येक के सभी तत्वों वाली एक नई सूची देता है। list.append()विधि एक है mutatorपर listजो अपनी ही संलग्न कर देता है object(अपने विशिष्ट उदाहरण सूची में तर्क cइस विषय के लिए) list। आपके उदाहरण में यह अपने आप में cएक संदर्भ जोड़ने के परिणामस्वरूप है (इसलिए अनंत पुनरावर्तन)।

'+' संघनन का विकल्प

list.extend()विधि को भी एक mutator विधि है जो अपने संयोजित करता है sequenceविषय के साथ तर्क list। विशेष रूप से, यह sequenceपुनरावृत्ति क्रम के प्रत्येक तत्व को जोड़ता है ।

एक तरफ

एक ऑपरेटर होने के नाते, +अभिव्यक्ति का परिणाम एक नए मूल्य के रूप में देता है। एक गैर-चेनिंग mutatorविधि होने के नाते , list.extend()विषय सूची को जगह में संशोधित करता है और कुछ भी नहीं लौटाता है।

Arrays

मैंने इसे संभावित भ्रम के कारण जोड़ा है जो एबेल के उत्तर की सूची, अनुक्रम और सरणियों की चर्चा को मिलाकर हो सकता है। Arraysदृश्यों और सूचियों के बाद पायथन में जोड़ा गया, अभिन्न डेटा प्रकारों के भंडारण सरणियों के अधिक कुशल तरीके के रूप में। के arraysसाथ भ्रमित मत करो lists। वे एक जैसे नहीं हैं।

से सरणी डॉक्स :

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


18

appendएक तत्व को एक सूची में जोड़ रहा है। यदि आप उस नई सूची के साथ सूची का विस्तार करना चाहते हैं जिसका आपको उपयोग करने की आवश्यकता है extend

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

4
मैंने सोचा कि यह बिल्कुल स्पष्ट है कि परिणाम अलग-अलग क्यों हैं, क्योंकि संचालन समान नहीं हैं! अगर ऐसा प्रतीत होता है +और extendविभिन्न परिणाम उत्पन्न करते हैं जिनके बारे में हमें कुछ सोचना होगा।
साइलेंटगॉस्ट

1
+1: क्यों मैं "क्यों" को नापसंद करता हूं: appendऔर +अलग हैं। इसीलिए। मुझे यह उत्तर पसंद है क्योंकि ऑफ़र ऐसा करता है जो अधिक समझ में आता है।
एस.लॉट

क्या यह साइट पूछे गए सवालों के जवाब देने के बारे में नहीं है? लोग पूछते हैं कि पीएचपी को पीएचपी क्यों कहा जाता है और __lt__पाइथन (आजकल यह क्यों हो सकता है) में अतिभारित नहीं किया जा सकता है। क्यों-प्रश्न सबसे आवश्यक हैं लेकिन अक्सर जवाब देने के लिए सबसे कठिन: वे सार के लिए पूछते हैं, मैनुअल के लिए एक सूचक के लिए नहीं। और निश्चित रूप से: यदि आप एक प्रश्न को नापसंद करते हैं (मैं सबसे अधिक नापसंद करता हूं), तो जवाब न दें; ;-)
हाबिल

आगे के प्रदर्शन के लिए, शायद शो c += [c]और c.append(c[:])भी।
१ient

2
@ अवि: क्यों है a+b != a*b? वे अलग-अलग ऑपरेशन कर रहे हैं। यही जवाब है। "क्यों" मैं अन्य प्रश्नों की तरह सहायक नहीं हूं, जैसे "मैं कैसे ठीक से संलग्न कर सकता हूं?" या "इस अपेंडमेंट में क्या गलत है जो अनंत पुनरावृत्ति की ओर ले जाता है?" फॉर्म के प्रश्न "मैं एक्स के लिए क्या करूं" या "एक्स किए जाने पर क्या गलत हो गया"? या "मुझे एक्स के बजाय क्या करना चाहिए" किसी को सीखने में मदद करेगा, लेकिन ध्यान केंद्रित करने योग्य, उपयोगी, कार्रवाई करने वाले उत्तर प्रदान करेगा।
एस.लॉट S

8

अजगर सूचियाँ विषम हैं जो एक ही सूची के तत्व हैं जो किसी भी प्रकार की वस्तु हो सकती हैं। अभिव्यक्ति: c.append(c)वस्तु cको सूचीबद्ध करता है जो कभी भी सूची में हो सकती है। मामले में यह सूची को सूची का सदस्य बनाता है।

अभिव्यक्ति c += cदो सूचियों को एक साथ जोड़ती है और चर को परिणाम प्रदान करती है c। अतिभारित +ऑपरेटर को नई सूची बनाने के लिए सूचियों पर परिभाषित किया गया है जिनकी सामग्री पहली सूची में तत्व और दूसरी सूची में तत्व हैं।

तो ये वास्तव में सिर्फ अलग-अलग अभिव्यक्तियाँ हैं जो डिज़ाइन द्वारा अलग-अलग काम करती हैं।


7

वह विधि जिसकी आप तलाश कर रहे हैं extend()। पायथन प्रलेखन से :

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).


2

प्रलेखन देखें :

list.append (एक्स)

  • सूची के अंत में एक आइटम जोड़ें; [len (a):] = [x] के बराबर।

list.extend (L) - दी गई सूची में सभी वस्तुओं को जोड़कर सूची का विस्तार करें; [len (a):] = L के बराबर।

c.append(c)एक तत्व के रूप में "अप" करता है । चूंकि एक सूची एक संदर्भ प्रकार है, यह एक पुनरावर्ती डेटा संरचना बनाता है।

c += cके समतुल्य है extend(c), जो c से c के तत्वों को जोड़ता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.