Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

कॉपी - पायथन में उथला और गहरी प्रतिलिपि संचालन

पायथन में एक चर वस्तु का सिर्फ एक संदर्भ है। इसलिए जब इसे किसी अन्य चर को सौंपा जाता है, तो यह वस्तु की नकल नहीं करता है, बल्कि यह उसी वस्तु के दूसरे संदर्भ के रूप में कार्य करता है। इसे आईडी () फ़ंक्शन का उपयोग करके सत्यापित किया जा सकता है

>>> L1 = [1,2,3]
>>> L2 = L1
>>> id(L1), id(L2)
(2165544063496, 2165544063496)

उपरोक्त कोड के परिणाम से पता चलता है कि दोनों सूची वस्तुओं के लिए id() समान है, जिसका अर्थ है कि दोनों एक ही वस्तु को संदर्भित करते हैं। L2 को L1 की उथली प्रति कहा जाता है। चूंकि दोनों एक ही वस्तु को संदर्भित करते हैं, दोनों में से कोई भी परिवर्तन अन्य वस्तु में प्रतिबिंबित होगा।

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L2[1] = 100
>>> L1,L2
([1, 100, 3], [1, 100, 3])

ऊपर के उदाहरण में, इंडेक्स नंबर पर आइटम। L2 का 1 बदल गया है। हम इस परिवर्तन को दोनों में प्रकट होते हुए देखते हैं।

जब कॉपी ऑपरेशन के साथ एक पूरी तरह से नई वस्तु बनाई जाती है, जिसमें नेस्टेड वस्तुओं की प्रतियां भी पुनरावर्ती रूप से जोड़ी जाती हैं, तो कॉपी को डीप कॉपी कहा जाता है।

पायथन मानक पुस्तकालय का कॉपी मॉड्यूल दो तरीके प्रदान करता है:

  • copy.copy() - एक उथली कॉपी बनाता है
  • copy.deepcopy() – एक डीप कॉपी बनाता है

एक उथली प्रतिलिपि एक नई वस्तु बनाती है और मूल तत्वों के संदर्भ को संग्रहीत करती है लेकिन नेस्टेड वस्तुओं की एक प्रति नहीं बनाती है। यह सिर्फ नेस्टेड वस्तुओं के संदर्भ की प्रतिलिपि बनाता है। परिणामस्वरूप, प्रतिलिपि प्रक्रिया पुनरावर्ती नहीं है।

>>> import copy
>>> L1 = [[1,2,3], [4,5,6]]
>>> L2 = copy.copy(L1)
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])
>>> L2.append([10,10,10])
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6], [10, 10, 10]])

यहाँ L1 एक नेस्टेड सूची है और L2 इसकी उथली प्रति है। हालांकि मूल सूची ऑब्जेक्ट का संदर्भ L2 में कॉपी किया गया है, इसके नेस्टेड तत्वों की प्रतिलिपि नहीं बनाई गई है। इसलिए, जब हम L2 में दूसरी सूची जोड़ते हैं, तो यह L1 में नहीं दिखाई देती है

हालाँकि, यदि हम चाइल्ड एलिमेंट में किसी एलीमेंट को संशोधित करने का प्रयास करते हैं, तो इसका प्रभाव दोनों सूचियों में दिखाई देगा

>>> L1 = [[1,2,3], [4,5,6]]
>>> L2 = copy.copy(L1)
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])
>>> L2[1][0] = 100
>>> L1,L2
([[1, 2, 3], [100, 5, 6]], [[1, 2, 3], [100, 5, 6]])

एक गहरी प्रतिलिपि हालांकि, एक नई वस्तु बनाती है और मूल तत्वों में मौजूद नेस्टेड वस्तुओं की प्रतियों को भी पुनरावर्ती रूप से जोड़ती है।

निम्नलिखित उदाहरण में, L2 L2 की एक गहरी प्रति है। अब अगर हम आंतरिक सूची के किसी भी तत्व को बदलते हैं, तो यह अन्य सूची में नहीं दिखाई देगा।

>>> L1 = [[1,2,3], [4,5,6]]
>>> L2 = copy.deepcopy(L1)
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])
>>> L2[1][0] = 100
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [100, 5, 6]])

इस प्रकार डीप कॉपी का प्रभाव आउटपुट द्वारा सत्यापित किया जाता है।


  1. शैलो कॉपी क्या है और यह C# में डीप कॉपी से कैसे अलग है?

    उथली कॉपी - किसी वस्तु की उथली प्रतिलिपि मुख्य वस्तु की प्रतिलिपि बनाती है, लेकिन आंतरिक वस्तुओं की प्रतिलिपि नहीं बनाती है। आंतरिक वस्तुओं को मूल वस्तु और उसकी प्रति के बीच साझा किया जाता है। उथली प्रतिलिपि के साथ समस्या यह है कि दो वस्तुएं स्वतंत्र नहीं हैं। यदि आप एक वस्तु को संशोधित करते हैं,

  1. जावा में डीप कॉपी और उथली कॉपी

    डीप कॉपी और उथली कॉपी दोनों अलग-अलग तरीकों से दिए गए ऑब्जेक्ट की कॉपी बनाने का संदर्भ देते हैं - उथली कॉपी यह मूल रूप से ऑब्जेक्ट का एक नया उदाहरण बनाता है और मूल डेटा सेट से सभी डेटा को नए बनाए गए इंस्टेंस में कॉपी करता है। इसका मतलब है कि नव निर्मित उदाहरण को विशेष रूप से मूल वस्तु में डालना होगा

  1. पायथन और टिंकर का उपयोग करके क्लिपबोर्ड से कॉपी करें

    क्लिपबोर्ड से कॉपी करने के लिए, हम clipboard_get() . का उपयोग कर सकते हैं टिंकर की विधि। आइए एक उदाहरण लें और देखें कि क्लिपबोर्ड से डेटा कैसे प्राप्त करें और इसे टिंकर विंडो पर प्रदर्शित करें। कदम - टिंकर लाइब्रेरी इंपोर्ट करें और टिंकर फ्रेम का इंस्टेंस बनाएं। ज्यामिति . का उपयोग करके फ़्रेम