2009-06-04 31 views
10

मैं एक सूची को संशोधित करने की कोशिश कर रहा हूँ और मेरी संशोधनों के बाद से थोड़ी सूझबूझ से काम मेरी सूची में बड़ी हो रही है और कर रहे थे मुझे लगता है मैं इस सोच किया निम्नलिखित कोडयदि स्लाइसिंग किसी सूची की एक प्रति नहीं बनाता है और न ही सूची करता है() मैं अपनी सूची की वास्तविक प्रति कैसे प्राप्त कर सकता हूं?

tempList=origList[0:10] 
for item in tempList: 
    item[-1].insert(0 , item[1]) 
    del item[1] 

का उपयोग कर अपनी सूची का एक टुकड़ा ले लिया है कि करने के लिए सभी संशोधन सूची tempList ऑब्जेक्ट को प्रभावित करेगी और मूल वस्तु नहीं होगी।

ठीक है जब मुझे अपना कोड सही हो गया और इसे मेरी मूल सूची में चलाया गया तो पहले दस आइटम (अनुक्रमित 0-9) ऊपर दिए गए कोड का परीक्षण करने में मेरे हेरफेर से प्रभावित हुए थे।

तो मैंने इसे गुगल किया और मुझे संदर्भ मिलते हैं जो कहते हैं कि एक टुकड़ा सूची को कॉपी करता है और एक नया बनाता है। मुझे कोड भी मिला जिसने मुझे वस्तुओं की आईडी खोजने में मदद की, इसलिए मैंने अपनी उत्पत्ति को खरोंच से बनाया, पहले दस वस्तुओं की आईडी प्राप्त की। मैंने सूची को फिर से काट दिया और पाया कि स्लाइस से आईडी ने मूल के पहले दस आइटमों से आईडी को मेल किया था।

मैं और अधिक नोटों कि एक सूची की प्रतिलिपि करने के लिए एक और अधिक pythonic तरीका सुझाव का उपयोग करने के

tempList=list(origList([0:10]) 

मुझे लगता है कि कोशिश की और मैं अब भी लगता है कि से आईडी tempList origList ID से मेल खानी होगी पाया।

कृपया बेहतर तरीके कोडिंग-मैं कैसे अपने दम पर एक सूची समझ में यह करने के लिए के बाद मुझे समझ में क्या कैसे नकल काम करता है

काई के जवाब सही के आधार पर यह पता लगाने जा रहा हूँ करने के लिए सुझाव नहीं देते विधि है:

import copy 
tempList=copy.deepcopy(origList[0:10]) 
id(origList[0]) 
>>>>42980096 
id(tempList[0]) 
>>>>42714136 

वर्क्स एक आकर्षण

उत्तर

24

स्लाइसिंग की तरह एक उथले कॉपी बन जाती है। आपके उदाहरण में, मैं देखता हूं कि आप आइटम [-1] पर सम्मिलित() को कॉल कर रहे हैं, जिसका अर्थ है कि आइटम सूचियों की एक सूची है। इसका मतलब है कि आपकी उथली प्रतियां अभी भी मूल वस्तुओं का संदर्भ देती हैं। आप पॉइंटर्स की प्रतियां बनाने के रूप में इसके बारे में सोच सकते हैं, वास्तविक वस्तुओं नहीं।

आपका समाधान इसके बजाय गहरी प्रतियों का उपयोग करने में निहित है। इस तरह की चीज़ के लिए पाइथन copy module प्रदान करता है। जब आप इसकी खोज करेंगे तो आपको उथले बनाम गहरी प्रतिलिपि पर बहुत अधिक जानकारी मिल जाएगी।

+0

बहुत उपयोगी-गूगल तुरंत गहरी बनाम उथले के साथ आया था। धन्यवाद। – PyNEwbie

4

यदि आप किसी ऑब्जेक्ट की प्रतिलिपि बनाते हैं तो इसकी सामग्री कॉपी नहीं की जाती है। शायद ज्यादातर मामलों में यह वही है जो आप चाहते हैं। आपके मामले में आपको यह सुनिश्चित करना होगा कि सामग्रियों की प्रतिलिपि बनाई गई है। आप copy.deepcopy का उपयोग कर सकते हैं, लेकिन यदि आपके पास सूचियों की सूची है या कुछ समान है तो मैं copy = [l[:] for l in list_of_lists] का उपयोग करने की अनुशंसा करता हूं, जो बहुत तेज़ होना चाहिए।

एक छोटी सी टिप्पणी अपने codestyle रहे हैं:

  • डेल ने एक बयान और नहीं एक समारोह तो यह वहाँ कोष्ठक का उपयोग नहीं करने के लिए बेहतर है, वे सिर्फ भ्रमित कर रहे हैं।
  • ऑपरेटर के आसपास और कॉमा के बाद व्हाइटसाइट्स आपके कोड को पढ़ने में आसान बना देगा।
  • सूची (alist) प्रतियां एक सूची है, लेकिन यह अधिक से अधिक alist pythonic नहीं है [:], मुझे लगता है कि alist [:] भी अधिक सामान्यतः तो वैकल्पिक प्रयोग किया जाता है।
+0

डेल-मुझे यह नहीं पता था और कोशिश करने के बाद और फिर कुछ फ़ंक्शंस (आईडी) की कोशिश करने के बाद मैंने यह बताने के लिए कि बयानों और कार्यों के बीच अंतर कैसे बताना है। मुझे इसमें डेल के साथ कुछ कोड मिला और उन्होंने माता-पिता का इस्तेमाल किया। आपके कोड ने मुझे नए आईडी दिए, इसलिए मैंने अपनी सूची की गहरी प्रतिलिपि बनाई जब मैंने किया: newl = [tempList [:] मूल में आइटम के लिए [0:10]]। copy.deepcopy हालांकि आसान लगता है। मैंने यह नहीं कहा कि यह अधिक पाइथोनिक हेनरी था .precheur.org ने कहा था कि यह था। लेकिन धन्यवाद मैंने कुछ सीखा – PyNEwbie

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