2011-11-30 22 views
7
>>> b = [] 
>>> c = '1234' 
>>> b += c 
>>> b 
['1', '2', '3', '4'] 
>>> 

यहां क्या हो रहा है? यह काम नहीं करना चाहिए, है ना? या मैं कुछ स्पष्ट याद कर रहा हूँ?किसी सूची में स्ट्रिंग जोड़ना

>>> b = [] 
>>> c = '1234' 
>>> b + c 
Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    b + c 
TypeError: can only concatenate list (not "str") to list 
>>> 

फिर a += b हमेशा a = a + b के बराबर नहीं है?

+1

प्रति किया जाना चाहिए था इस व्यवहार अभी भी अजगर 3.x में मौजूद है है? मुझे हमेशा यह परेशान लगता है कि एक मानक लाइब्रेरी प्रकार सामान्य अनुबंध को तोड़ता है जो 'ए + = बी' <=>' ए = ए + बी' (मूल 'ए' मान के किसी भी अन्य संदर्भ को प्रभावित किए बिना)। –

+2

@ करल कंचटेल: दुर्भाग्यवश, यह अभी भी पायथन 3.2.1 में मौजूद है। –

+0

मैं इसे पायथन 3.2 में देख रहा था, हां। मुझे इस मुद्दे को एक शुरुआती कोड की तलाश में मिला जो गलत परिणाम दे रहा था। मुझे 'सीखने पायथन' में इस विशिष्ट व्यवहार का कोई संदर्भ नहीं मिला। मैंने पीईपी 203 की जांच की और कहा कि '__iadd__' का उपयोग किया जाता है लेकिन वे यह भी कहते हैं कि' __iadd__' जगह '__add__' है जो इस मामले में नहीं है ... शायद कोई इस व्यवहार या बिंदु/लिंक के नीचे तर्कसंगत समझा सकता है इसके बारे में कुछ चर्चा करने के लिए? मैं कार्ल की टिप्पणी से समझता हूं कि इसके बारे में लोग चिंतित हैं – joaquin

उत्तर

2

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

(वास्तव में += किसी भी iterable लगते हैं।)

+0

बी = बी + सी विफल रहता है – joaquin

+2

'+' '+ =' से भिन्न ऑपरेटर है। –

+0

मुझे पता है, इसे संवर्धित आकलन कहा जाता है और इसे ए = ए + बी के बराबर परिभाषित किया जाता है (पीईपी 203 देखें)। इस परिभाषा को लेना मुझे गलत उम्मीद के लिए सख्ती से ड्राइव करता है। मुझे आश्चर्य है कि (शायद मैंने अपने पायथन कोड में एक स्ट्रिंग में एक सूची जोड़ने की हिम्मत नहीं की है, इसलिए मैंने इससे पहले कभी टक्कर नहीं ली)। 'अस्पष्टता के चेहरे में नहीं, अनुमान लगाने के लिए प्रलोभन मना कर दिया जाना चाहिए'? सही शब्दावली का उपयोग करने के लिए – joaquin

11

स्ट्रिंग्स iterable हैं: तत्वों स्ट्रिंग के पात्र हैं। जब आप किसी सूची में एक पुनरावर्तनीय जोड़ते हैं, तो इटेरेबल के तत्व सूची में शामिल हो जाते हैं।

b += [c] 

या

b.append(c) 
+0

+1: 'iterable' – gecco

9

+= ऑपरेटर :

निम्नलिखित में से किसी (स्ट्रिंग के पात्रों के साथ सूची का विस्तार नहीं यानी स्ट्रिंग संलग्न,) क्या आप उम्मीद कर रहे हैं क्या करेंगे को इसमें शामिल करने की बजाय एक सूची बढ़ाती है:

>>> b = [] 
>>> c = "1234" 
>>> b.append(c) 
>>> b 
['1234'] 
>>> b.extend(c) 
>>> b 
['1234', '1', '2', '3', '4'] 
>>> b += c 
>>> b 
['1234', '1', '2', '3', '4', '1', '2', '3', '4'] 
>>> b += [c] 
>>> b 
['1234', '1', '2', '3', '4', '1', '2', '3', '4', '1234'] 
+0

क्या आप इन ऑपरेटरों ('+', '+ =') के प्रभाव पर पुनरावृत्तियों/स्रोतों के प्रभाव पर दस्तावेज़ीकरण का स्रोत जानते हैं ...? – moooeeeep

0

आपने क्या उम्मीद की थी? ऐसा करने के लिए आप स्ट्रिंग के रूप में जोड़ना चाहते हैं आप चाहिए:

b.append(c) 

चीयर्स!

+0

मुझे उम्मीद है कि यह – joaquin

+0

विफल हो जाएगा लेकिन जैसा कि टिम + = के व्यवहार से ऊपर समझाया गया है, वही नहीं है कि + – ocell

+0

कृपया, टिम पोस्ट पर टिप्पणी देखें। – joaquin

0

संक्षेप में, सूची में + = ऑपरेटर सी के पुनरावर्तक को पुनर्प्राप्त करेगा, जो व्यक्तिगत वर्णों को क्रम में प्राप्त करेगा। यदि आप सूची में वास्तविक स्ट्रिंग को जोड़ना चाहते हैं, तो परिणाम ['1234'] प्राप्त करना, आप इसके बजाय b.append ('1234') का उपयोग कर सकते हैं।

2

+ = विस्तार के लिए वाक्य रचनात्मक चीनी है, लेकिन + सिर्फ सूची सम्मिलन है। यदि आप विस्तार करते हैं, तो आप तर्क पर पुन: प्रयास करेंगे, जो इस मामले में एक स्ट्रिंग है। लेकिन आप किसी स्ट्रिंग को किसी सूची में संयोजित नहीं कर सकते हैं, इसलिए + विफल रहता है।

3

यह मूल प्रश्न (जो मुझे लगता है कि पर्याप्त रूप से उत्तर दिया गया है) का उत्तर नहीं है, लेकिन संवर्धित असाइनमेंट (+= और इसी तरह के संचालन) के अर्थशास्त्र के बारे में टिप्पणियों में पूछे गए कई प्रश्नों के लिए।

संक्षेप में: अपरिवर्तित असाइनमेंट अपरिवर्तनीय लोगों की तुलना में परिवर्तनीय प्रकारों के लिए अलग-अलग काम करता है।

str, tuple, और संख्यात्मक प्रकार, दूसरों के बीच, अपरिवर्तनीय हैं। एक बार यह बनाया गया है एक टपल की सामग्री को बदला नहीं जा सकता है, तो आप इस व्यवहार मिलता है:

>>> a = (1, 2) 
>>> b = a 
>>> a += (3, 4) 
>>> a 
(1, 2, 3, 4) 
>>> b 
(1, 2) 

str एक ही अर्थ विज्ञान है। असल में, a = a + b के बराबर है यदि a अपरिवर्तनीय है।

list समेत अधिकांश अन्य प्रकार, परिवर्तनीय हैं।एक सूची की सामग्री जगह में बदला जा सकता है, और संवर्द्धित असाइनमेंट वास्तव में ऐसा करता है। इसलिए:

>>> a = [1, 2] 
>>> b = a 
>>> a += [3, 4] 
>>> a 
[1, 2, 3, 4] 
>>> b 
[1, 2, 3, 4] 

जबकि यदि तीसरी लाइन a = a + [3, 4] ने प्रतिस्थापित किया, एक नई सूची बनाई जाएगी और b[1, 2] होगा।

उपयोगकर्ता-निर्धारित कक्षा के लिए, अर्थ विज्ञान है कि यह कैसे लागू किया गया था पर निर्भर करते हैं, लेकिन यह है कि यह कैसे पीईपी 203

+0

यह वास्तव में एक अच्छा अवलोकन है। 'a' और' b' एक ही स्मृति पता साझा करते हैं जब तक कि एक असाइनमेंट ऑपरेटर के बाईं ओर 'ए' का मूल्यांकन नहीं किया जाता है? क्या आप इसे शामिल कर सकते हैं? – Droogans

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