2013-06-13 8 views
9

बस जब मैंने सोचा कि मैं समझ गया था कि कैसे अजगर सूचियों के काम ...प्रतिलिपि बनाई जा रही अजगर सूचियों

>>> a = [1,2,3] 
>>> b = a[:] 
>>> b 
[1,2,3] 
>>> b[1]=100 
>>> b 
[1,100,3] 
>>> a 
[1,2,3] 

अब तक तो अच्छा। मैं बी की सामग्री के साथ शुरू कर रहा हूं, ताकि बी एक अलग वस्तु को इंगित कर सके। नतीजतन, बी में परिवर्तन ए को प्रभावित नहीं करते हैं।

अब इस दूसरे उदाहरण पर एक नज़र डालें:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> b = a[:][:] 
>>> b 
[[1,2,3],[4,5,6],[7,8,9]] 
>>> b[1][1] = 100 
>>> b 
[[1,2,3],[4,100,6],[7,8,9]] 
>>> a 
[[1,2,3],[4,100,6],[7,8,9]] 

क्यों ख में परिवर्तन एक इस बार प्रभावित किया है? पिछले उदाहरण से अलग क्या है?

+1

ध्यान दें कि कॉपी करने के लिए '[:]' का उपयोग करना थोड़ा सा गूढ़ है - आमतौर पर मुझे संदर्भ के आधार पर 'सूची() 'या' copy.copy() 'का उपयोग करने के लिए बहुत अच्छा लगता है। (बेशक, जैसा कि उत्तर में बताया गया है, 'copy.deepcopy() 'हो सकता है जो आप यहां चाहते हैं)। –

उत्तर

11

स्लाइसिंग ऑपरेशन x[:]उथली प्रति बनाता है। इसका मतलब है, बाहरी सूची अलग है, लेकिन इसमें सटीक तत्व शामिल हैं। मान a = [[1]]:

b = a[:] # is the same as: 
b = [x for x in a] 

>>> a[0] is b[0] 
True 

डबल टुकड़ा करने की क्रिया ([:][:]) कि से ज्यादा कुछ नहीं कर रही है - फिर से:

b = a[:][:] # is the same as: 
b = [y for y in [x for x in a]] 

>>> a[0] is b[0] 
True 

एक उथले प्रतिलिपि की एक उथले प्रतिलिपि, है अच्छी तरह से, एक उथले प्रति।

तो b अभी भी a की एक उथली प्रतिलिपि है - ये सूचियां अलग-अलग वस्तुएं हैं, लेकिन उनमें समान तत्व हैं। फिर आप आंतरिक सूची को b में बदल देते हैं, लेकिन यह a में एक ही सूची है।

2-स्तर की उथली प्रति b=[x[:] for x in a] के साथ की जा सकती है। यह एन-स्तरीय प्रतिलिपि के लिए एक ही तरीका है।

वैसे, "उथली प्रतिलिपि" शब्द का अर्थ किसी वर्ग या कंटेनर के लिए समान अर्थ है।

यदि आप असली गहरी प्रतिलिपि चाहते हैं, तो आपको deep copy का उपयोग करने पर विचार करना चाहिए।

+1

ए 'उथली प्रतिलिपि'! मुझे उस अवधारणा को नहीं पता था। शायद आप इसे थोड़ी अधिक समझाने के लिए थोड़ा सा जवाब संपादित कर सकते हैं (केवल कुछ शब्द)। –

+0

एक समाधान के साथ एक अच्छा स्पष्टीकरण के लिए +1 – Sid

+0

@MarcosGonzalez अब बेहतर है? – Elazar

4

चुप्पी [:] एक उथली प्रतिलिपि बनाता है। लेकिन आंतरिक वस्तुओं की नकल की नहीं रह इसलिए यदि वे परिवर्तनशील होते हैं और आप उन्हें संशोधित होगा कि वे संशोधित किया जाएगा;) और दोनों सूची में आप इस

उपयोग सूची समझ

b = [i[:] for i in a] 

या copy.deepcopy देखेंगे()

import copy 
b = copy.deepcopy(a) 
+0

संकेतों के लिए धन्यवाद! –

1

इस प्रयास करें:

In [38]: import copy 

In [39]: a = [[1,2,3],[4,5,6],[7,8,9]] 

In [40]: b=copy.deepcopy(a) 

In [41]: b[1][1] = 100 

In [42]: a 
Out[42]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [43]: b 
Out[43]: [[1, 2, 3], [4, 100, 6], [7, 8, 9]] 

अधिक @http://docs.python.org/2/library/copy.html पढ़ें

+0

संकेत के लिए धन्यवाद। –

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