कभी-कभी, आप किसी ऑब्जेक्ट की पूरी प्रतिलिपि चाहेंगे, कभी-कभी आप चाहेंगे कि इसमें संदर्भों का उपयोग किया जाए। कार्रवाई में अंतर देखें.
पायथन डेटा प्रबंधन के लिए कई कुशल दृष्टिकोण प्रदान करता है। नेस्टेड सूचियों, शब्दकोशों या कस्टम ऑब्जेक्ट्स जैसी डेटा संरचनाओं के साथ काम करते समय उथली और गहरी प्रतिलिपि अवधारणाओं को समझना महत्वपूर्ण है।
उथली और गहरी दोनों प्रतिलिपियाँ आपको डेटा संरचनाओं की प्रतिकृतियाँ बनाने देती हैं, लेकिन वे नेस्टेड डेटा के संबंध में अलग तरह से कार्य करती हैं।
उथली प्रतिलिपि का उपयोग करना
शैलो कॉपी मूल वस्तु की शीर्ष-स्तरीय संरचना की एक प्रति बनाकर काम करती है। इसका मतलब यह है कि, यदि मूल ऑब्जेक्ट में नेस्टेड ऑब्जेक्ट हैं, तो प्रतिलिपि उन्हीं नेस्टेड ऑब्जेक्ट को संदर्भित करेगी जो मूल में है। दूसरे शब्दों में, किसी वस्तु की उथली प्रतिलिपि बनाना उसकी सबसे बाहरी संरचना की नकल करता है, न कि उसमें मौजूद किसी भी नेस्टेड वस्तु की।
पायथन में उथली प्रतिलिपि बनाने के लिए, आप कॉपी मॉड्यूल का उपयोग कर सकते हैं प्रतिलिपि() फ़ंक्शन या .कॉपी() वस्तु पर विधि.
के एक उदाहरण पर विचार करें पायथन में किसी सूची या शब्दकोश के साथ काम करना.
import copy
main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100
print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")
उपरोक्त कोड में, मुख्य_सूची वेरिएबल में पूर्णांकों वाली एक सूची और अक्षरों वाली एक आंतरिक सूची (नेस्टेड ऑब्जेक्ट) होती है। कॉपी फ़ंक्शन इसकी एक प्रतिलिपि बनाता है मुख्य_सूची जिसे कोड दूसरे वेरिएबल में संग्रहीत करता है, उथली प्रतिलिपि.
आपके द्वारा किया गया कोई भी परिवर्तन उथली प्रतिलिपि नेस्टेड सूची भी सीधे प्रभावित करेगी मुख्य_सूची और इसके विपरीत। ये परिवर्तन दर्शाते हैं कि नेस्टेड या आंतरिक सूची उथली प्रतिलिपि का केवल एक संदर्भ है मुख्य_सूची, परिवर्तनों को लागू करना मुख्य_सूची बहुत।
इस बीच, किसी भी बाहरी आइटम (पूर्णांक) में कोई भी परिवर्तन किया गया उथली प्रतिलिपि या मुख्य_सूची केवल उस उदाहरण को प्रभावित करेगा. ये बाहरी वस्तुएँ अपने आप में स्वतंत्र मूल्य हैं, न कि केवल संदर्भ।
import copy
main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"
print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")
आउटपुट दर्शाता है कि दोनों सूची के बाहरी आइटम एक दूसरे से स्वतंत्र हैं:
शब्दकोशों के साथ काम करते समय भी यही विचार लागू होता है।
dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}}
dict2 = dict1.copy()# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00
print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")
के नेस्टेड शब्दकोश में परिवर्तन किये गये तानाशाही1 दोनों को प्रभावित करें तानाशाही1 और dict2. इसी समय, बाहरी वस्तुओं में परिवर्तन होता है तानाशाही1 केवल इसे प्रभावित करें.
डीप कॉपी का उपयोग करना
मूल प्रतिलिपि की नेस्टेड वस्तुओं को संदर्भित करने के बजाय, एक गहरी प्रतिलिपि मूल वस्तु और उसकी नेस्टेड वस्तुओं की एक पूरी तरह से अलग प्रतिलिपि बनाती है। गहरी प्रतिलिपि को संशोधित करने से मूल वस्तु प्रभावित नहीं होगी और इसके विपरीत; वे वास्तव में अलग मूल्य हैं।
पायथन में एक गहरी प्रतिलिपि बनाने के लिए, का उपयोग करें डीपकॉपी() कॉपी मॉड्यूल का कार्य।
किसी सूची के साथ काम करने के एक उदाहरण पर विचार करें.
import copy
main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500
print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")
यहां, कोड की एक गहरी प्रतिलिपि निष्पादित करता है मुख्य_सूची, नामक एक स्वतंत्र प्रति बनाना Deep_copy.
जब आप नेस्टेड सूची या बाहरी आइटम को संशोधित करते हैं Deep_copy, आपके परिवर्तन मूल सूची को प्रभावित नहीं करते हैं, और इसके विपरीत भी। यह दर्शाता है कि नेस्टेड सूची या बाहरी तत्व दो प्रतियों के बीच साझा नहीं किए गए हैं।
कस्टम ऑब्जेक्ट के साथ कार्य करना
आप इसके द्वारा एक कस्टम ऑब्जेक्ट बना सकते हैं पायथन क्लास को परिभाषित करना और कक्षा का एक उदाहरण बनाना।
यहां a से एक साधारण ऑब्जेक्ट बनाने का एक उदाहरण दिया गया है किताब कक्षा:
classBook:
def__init__(self, title, authors, price):
self.title = title
self.authors = authors
self.price = price
def__str__(self):
returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"
अब, इसके उदाहरण की उथली प्रतिलिपि और गहरी प्रतिलिपि दोनों बनाएं किताब क्लास का उपयोग कर रहा हूँ कॉपी मापांक।
import copy
# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
["Bobby Jack", "Princewill Inyang"], 1000)# Make a shallow copy
book2 = copy.copy(book1)# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50
# Check the objects
print(book1)
print(book2)
जैसा कि आप देख सकते हैं, उथली प्रतिलिपि (पुस्तक2) एक नई वस्तु है, लेकिन यह मूल वस्तु के समान आंतरिक वस्तु (लेखक सूची) को संदर्भित करती है (पुस्तक 1). इसलिए, मूल वस्तु के लेखकों में परिवर्तन दोनों उदाहरणों (पुस्तक 1 और पुस्तक 2) को प्रभावित करता है, जबकि बाहरी वस्तु में परिवर्तन (कीमत) केवल मूल वस्तु को प्रभावित करता है (पुस्तक 1).
दूसरी ओर, एक गहरी प्रतिलिपि बनाने से मूल वस्तु की एक स्वतंत्र प्रतिलिपि बन जाती है, जिसमें उसके भीतर मौजूद सभी वस्तुओं की प्रतियां शामिल होती हैं।
# Create a Book object
book1 = Book("Why MakeUseOf Deep Copy?", \
["Bobby Jack", "Yuvraj Chandra"], 5000)# Make a deep copy
book2 = copy.deepcopy(book1)# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60
# Check the objects
print(book1)
print(book2)
इस मामले में, गहरी प्रतिलिपि (पुस्तक2) एक पूरी तरह से स्वतंत्र वस्तु है, और मूल वस्तु को संशोधित कर रही है (पुस्तक 1) इसे प्रभावित नहीं करता.
शैलो कॉपी और डीप कॉपी के लिए उपयोग
गहरी और उथली प्रतिलिपि को समझना महत्वपूर्ण है ताकि आप डेटा में हेरफेर करने के लिए उपयुक्त दृष्टिकोण का चयन कर सकें। यहां कुछ परिदृश्य दिए गए हैं जहां प्रत्येक विधि लागू होती है:
- यदि आप किसी जटिल वस्तु को उसकी नेस्टेड वस्तुओं के नए उदाहरण उत्पन्न किए बिना दोहराना चाहते हैं तो एक उथली प्रतिलिपि का उपयोग करें। यह दृष्टिकोण डीप कॉपी की तुलना में अधिक मेमोरी कुशल और तेज़ है क्योंकि यह नेस्टेड ऑब्जेक्ट की नकल नहीं करता है।
- मूल और कॉपी किए गए ऑब्जेक्ट के बीच कुछ अंतर्निहित डेटा साझा करते हुए किसी ऑब्जेक्ट की स्थिति का स्नैपशॉट बनाने के लिए एक उथली प्रतिलिपि का उपयोग करें।
- यदि आप मूल वस्तु को प्रभावित किए बिना किसी वस्तु की प्रतिकृति को संशोधित करना चाहते हैं तो एक गहरी प्रतिलिपि का उपयोग करें। यह नेस्टेड ऑब्जेक्ट्स की स्वतंत्र प्रतियां उत्पन्न करता है, यह सुनिश्चित करते हुए कि कॉपी में कोई भी परिवर्तन मूल पर लागू नहीं होता है।
- जब आपको नेस्टेड डेटा संरचनाओं की स्वतंत्र प्रतियों की आवश्यकता होती है, तो डीप कॉपी महत्वपूर्ण होती है, मुख्य रूप से पुनरावर्ती या जटिल ऑब्जेक्ट पदानुक्रम से निपटने के दौरान।
प्रदर्शन और विचार
चूंकि उथली प्रतिलिपि नेस्टेड ऑब्जेक्ट के नए उदाहरण उत्पन्न नहीं करती है, यह आम तौर पर तेजी से चलती है और गहरी प्रतिलिपि की तुलना में कम मेमोरी का उपयोग करती है। हालाँकि, मूल और उथली प्रतिलिपि में साझा आंतरिक आइटम बदलने से अवांछित दुष्प्रभाव हो सकते हैं।
विशेष रूप से बड़ी और गहराई से नेस्टेड डेटा संरचनाओं, गहरी प्रतिलिपि के लिए, एक पुनरावर्ती प्रक्रिया, धीमा हो सकता है और अधिक मेमोरी का उपयोग कर सकता है। हालाँकि, यह मूल और गहरे डुप्लिकेट के बीच पूर्ण स्वतंत्रता सुनिश्चित करता है, जिससे जटिल डेटा हेरफेर अधिक सुरक्षित हो जाता है।
आपके डेटा के लिए सर्वोत्तम प्रतिलिपि विकल्प
कई प्रोग्रामिंग भाषाएं उथली और गहरी प्रतिलिपि की अवधारणा का उपयोग करती हैं। इसे समझने से आप अप्रत्याशित परिणामों के बिना डेटा में हेरफेर कर सकते हैं।
उथली और गहरी प्रतिलिपि तकनीकों का उपयोग करके, आप अपनी डेटा संरचनाओं को सुरक्षित रूप से डुप्लिकेट करने के लिए सर्वोत्तम दृष्टिकोण का चयन कर सकते हैं। अपने डेटा पर पड़ने वाले प्रभावों को समझकर, आप अपने कोड से अधिक भरोसेमंद और पूर्वानुमानित परिणाम प्राप्त करेंगे।