2013-05-20 10 views
24
list = [1, 2, 3] 
print list.append(4) ## NO, does not work, append() returns None 
## Correct pattern: 
list.append(4) 
print list ## [1, 2, 3, 4] 

मैं पाइथन सीख रहा हूं और मुझे यकीन नहीं है कि यह समस्या भाषा के लिए विशिष्ट है और पाइथन में कैसे संलग्न किया जाता है।इस कोड में कोई भी वापसी क्यों नहीं करता है?

+3

पहले उदाहरण में, आपका प्रिंटिंग परिशिष्ट ऑपरेशन का परिणाम प्रिंटिंग। अगर संलग्न() सफलतापूर्वक पूरा हो गया है, तो यह 'कोई नहीं' लौटा रहा है, जैसा कि समस्याएं आईं: कोई भी – ChaseTheSun

+5

'संलग्न' वापस काम नहीं करेगा, अगर कोई काम नहीं करता है। इसके मुकाबले ज्यादा कुछ नहीं है। – squiguy

+0

आह यह समझना आसान होगा (कम से कम मेरे लिए) यदि मूल कोड में टिप्पणी ने उल्लेख किया था कि 'संलग्न' एक 'शून्य' कार्य है। यह समझ में आता है, धन्यवाद। –

उत्तर

29

append एक विनाशकारी आपरेशन (यह जगह में के बजाय एक नई सूची लौटने की सूची को संशोधित करता है) नहीं है। मुहावरेदार तरीके से करना append की गैर विनाशकारी बराबर

l = [1,2,3] 
print l + [4] # [1,2,3,4] 
print l # [1,2,3] 

आपके प्रश्न का उत्तर होगा, मेरा अनुमान है अगर append नए संशोधित सूची लौट आए, उन सोच सकते हैं कि यह गैर विनाशकारी था, वे यानी है जैसे

m = l.append("a") 
n = l.append("b") 

कोड लिखने और n[1,2,3,"b"]

3

सलाह का एक शब्द कुंजी शब्द या कार्यों को परिवर्तनीय नामों के रूप में उपयोग करने से बचाना होगा। ऊपर अपने कोड में, आप एक चर के रूप में सूची का उपयोग करें:

list = [1, 2, 3] 

मैं वास्तव में पहले से ही एक builtin प्रकार के रूप में परिभाषित किया गया है list के रूप में एक चर नाम के रूप में list उपयोग करने के खिलाफ सलाह देंगे। के रूप में ChaseTheSun और squiguy ने बताया, वहाँ भी बहुत कुछ करने के लिए यह तो

l = [1, 2, 3] 
l.append(4) 
print l ## [1, 2, 3, 4] 
+0

यह इंगित करने के लिए धन्यवाद कि मैं उस अभ्यास के बारे में अच्छी तरह से जानता हूं। मैंने बस एक और स्रोत से कोड कॉपी और चिपकाया। –

7

होने के लिए यह अजगर में एक परंपरा है कि तरीकों कि दृश्यों उत्परिवर्तित लौट +०१२३६९३००६०५ है उम्मीद कर सकते हैं।

पर विचार करें:

>>> a_list = [3, 2, 1] 
>>> print a_list.sort() 
None 
>>> a_list 
[1, 2, 3] 

>>> a_dict = {} 
>>> print a_dict.__setitem__('a', 1) 
None 
>>> a_dict 
{'a': 1} 

>>> a_set = set() 
>>> print a_set.add(1) 
None 
>>> a_set 
set([1]) 

अजगर 3.3 में शुरू, यह अब explicitly documented अधिक है:

कुछ संग्रह कक्षाएं परिवर्तनशील हैं। वे विधियां जो जोड़ती हैं, घटाती हैं या अपने सदस्यों को जगह में पुनर्व्यवस्थित करती हैं, और एक विशिष्ट आइटम नहीं लौटाती हैं, संग्रह उदाहरण को कभी भी वापस नहीं लौटाते हैं लेकिन None

डिजाइन और इतिहास पूछे जाने वाले प्रश्न gives the reasoning इस डिजाइन फैसले के पीछे (सम्मान के साथ सूची में):

क्यों अनुसार क्रमबद्ध सूची वापस नहीं list.sort() करता है?

परिस्थितियों में जहां प्रदर्शन महत्वपूर्ण है, सूची की प्रतिलिपि बनाने के लिए बस इसे अपमानजनक बना दिया जाएगा। इसलिए, list.sort() जगह पर सूची टाइप करता है। आपको उस तथ्य की याद दिलाने के लिए, यह क्रमबद्ध सूची वापस नहीं करता है। इस तरह, आपको किसी क्रमबद्ध प्रति की आवश्यकता होने पर गलती से सूची में ओवरराइट करने में बेवकूफ नहीं बनाया जाएगा, बल्कि को आस-पास के संस्करण को रखने की आवश्यकता है।

पायथन 2.4 में एक नया अंतर्निर्मित फ़ंक्शन - sorted() - जोड़ा गया है। यह फ़ंक्शन एक प्रदान की गई एक नई सूची बनाता है, इसे टाइप करता है और इसे वापस करता है।

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