2008-10-22 14 views
12

को बनाए रखते हुए एक सूची उत्तीर्ण करना तो मैं खुद को पायथन पढ़ रहा हूं, और मुझे सूचियों के साथ कोई समस्या है। मैं मूल सूची को बनाए रखने के दौरान अपने कार्य को एक सूची और पॉप आइटम पास करना चाहता हूं। मैं पाइथन "इंस्टेंस" को पास की गई सूची कैसे बना सकता हूं बल्कि मूल के लिए पॉइंटर पास कर रहा हूं?मूल

उदाहरण:

def burninate(b): 
    c = [] 
    for i in range(3): 
     c.append(b.pop()) 
    return c 

a = range(6) 
d = burninate(a) 
print a, d 

आउटपुट: [0, 1, 2] [5, 4, 3]
वांछित उत्पादन: [0, 1, 2, 3, 4, 5] [5, 4, 3]

धन्यवाद!

+0

http: // stackoverflow।कॉम/प्रश्न/184643/व्हाट-इ-द-बेस्ट-वे-टू-कॉपी-ए-लिस्ट-इन-पायथन –

+0

ट्रोगडोर, आपके डेटा को जला देना !!! –

उत्तर

14

जैसा कि अन्य उत्तरों ने सुझाव दिया है, आप सूची के एक प्रति के साथ अपना कार्य प्रदान कर सकते हैं।

एक विकल्प के रूप में, अपने समारोह तर्क की एक प्रति ले सकता है:

def burninate(b): 
    c = [] 
    b = list(b) 
    for i in range(3): 
     c.append(b.pop()) 
    return c 

मूल रूप से, आप अपने मन (और अपने दस्तावेज में) में स्पष्ट अपने कार्य अपने तर्कों बदल जाएगा कि क्या करने की आवश्यकता है। मेरी राय में, गणना किए गए मानों को वापस करने वाले कार्यों को उनके तर्कों को नहीं बदला जाना चाहिए, और उनके तर्कों को बदलने वाले कार्यों को कुछ भी वापस नहीं करना चाहिए। उदाहरण के लिए पाइथन [] .sort(), [] .extend(), {} .update(), आदि देखें। जाहिर है अपवाद हैं (जैसे .pop())।

इसके अलावा, आपके विशेष मामले के आधार पर, आप पॉप() या तर्क को संशोधित करने वाले अन्य कार्यों का उपयोग करने से बचने के लिए फ़ंक्शन को फिर से लिख सकते हैं। जैसे

def burninante(b): 
    return b[:-4:-1] # return the last three elements in reverse order 
+0

मुझे अब तक के सबसे छोटे संस्करण के लिए आपके रिवर्स स्लाइस +1 – mhawke

+0

+1 पसंद है –

10

आप इस तरह की सूची की एक प्रति के साथ burninate() कॉल कर सकते हैं:

d = burninate(a[:])

या,

d = burninate(list(a))

अन्य वैकल्पिक में सूची की एक प्रति बनाना है आपके विधि:

def burninate(b): 
    c=[] 
    b=b[:] 
    for i in range(3): 
     c.append(b.pop()) 
    return c 

>>> a = range(6) 
>>> b = burninate(a) 
>>> print a, b 
>>> [0, 1, 2, 3, 4, 5] [5, 4, 3] 
6

एक से थोड़ा अधिक पठनीय एक ही बात करने के लिए तरीका है:

d = burninate(list(a)) 

यहाँ, list() निर्माता a के आधार पर एक नई सूची बनाता है।

2

अन्य संस्करणों:

def burninate(b): 
    c = [] 
    for i in range(1, 4): 
     c.append(b[-i]) 
    return c 
def burninate(b): 
    c = b[-4:-1] 
    c.reverse() 
    return c 

और किसी दिन आप सूची comprehensions प्यार करेंगे:

def burninate(b): 
    return [b[-i] for i in range(1,4)] 
5

एक अधिक सामान्य समाधान import copy हो, और पैरामीटर पर copy.copy() का प्रयोग करेंगे।

+0

यदि आप कुछ सूची की अपेक्षा कर रहे हैं, तो इसे किसी भी समस्या का उपयोग केवल सूची() के लिए नहीं करना चाहिए। –

1

आप copy.deepcopy उपयोग कर सकते हैं()

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