Python 3.7 - copy

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




python

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

स्रोत कोड: Lib/copy.py

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

इंटरफ़ेस सारांश:

copy.copy(x)

X की उथली प्रति लौटाएं।

copy.deepcopy(x)

X की गहरी प्रति लौटाएं।

exception copy.error

मॉड्यूल विशिष्ट त्रुटियों के लिए उठाया गया।

उथली और गहरी नकल के बीच का अंतर केवल यौगिक वस्तुओं के लिए प्रासंगिक है (ऐसी वस्तुएं जिनमें अन्य वस्तुएं होती हैं, जैसे सूची या वर्ग उदाहरण):

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

दो समस्याएँ अक्सर गहरी प्रतिलिपि संचालन के साथ मौजूद होती हैं जो उथले प्रतिलिपि कार्यों के साथ मौजूद नहीं होती हैं:

  • पुनरावर्ती वस्तुएँ (ऐसी यौगिक वस्तुएँ जो प्रत्यक्ष या अप्रत्यक्ष रूप से अपने आप में एक संदर्भ रखती हैं) एक पुनरावर्ती पाश का कारण बन सकती हैं।
  • क्योंकि गहरी कॉपी हर चीज की नकल कर सकती है, वह बहुत ज्यादा कॉपी कर सकती है, जैसे कि डेटा जिसे कॉपी के बीच साझा किया जाना है।

deepcopy() फ़ंक्शन इन समस्याओं से बचता है:

  • वर्तमान प्रतिलिपि पासिंग के दौरान पहले से कॉपी की गई वस्तुओं का "ज्ञापन" शब्दकोश रखना; तथा
  • उपयोगकर्ता-परिभाषित कक्षाओं को कॉपी करने वाले ऑपरेशन या कॉपी किए गए घटकों के सेट को ओवरराइड करने देता है।

यह मॉड्यूल मॉड्यूल, विधि, स्टैक ट्रेस, स्टैक फ्रेम, फ़ाइल, सॉकेट, विंडो, सरणी या किसी भी प्रकार के प्रकारों की नकल नहीं करता है। यह "कॉपी" कार्यों और कक्षाओं (उथले और गहराई से) करता है, मूल वस्तु को अपरिवर्तित वापस करके; यह pickle मॉड्यूल द्वारा इलाज किए जाने के तरीके के साथ संगत है।

शब्दकोशों की dict.copy() प्रतियां dict.copy() और पूरी सूची का एक टुकड़ा बताकर सूचियों का उपयोग करके बनाई जा सकती हैं, उदाहरण के लिए, copied_list = original_list[:]

नकल को नियंत्रित करने के लिए उपयोग करने के लिए कक्षाएं एक ही इंटरफेस का उपयोग कर सकती हैं। इन तरीकों की जानकारी के लिए मॉड्यूल pickle का वर्णन देखें। वास्तव में, copy मॉड्यूल, copyreg मॉड्यूल से पंजीकृत अचार कार्यों का उपयोग करता है।

एक वर्ग के लिए अपनी स्वयं की कॉपी कार्यान्वयन को परिभाषित करने के लिए, यह विशेष तरीकों को परिभाषित कर सकता है __copy__() और __deepcopy__() । पूर्व को उथले कॉपी ऑपरेशन को लागू करने के लिए कहा जाता है; कोई अतिरिक्त तर्क पारित नहीं किया जाता है। उत्तरार्द्ध को गहरी प्रतिलिपि संचालन को लागू करने के लिए कहा जाता है; यह एक तर्क है, ज्ञापन शब्दकोश। यदि __deepcopy__() कार्यान्वयन को किसी घटक की गहरी प्रतिलिपि बनाने की आवश्यकता है, तो उसे deepcopy() फ़ंक्शन को पहले तर्क के साथ और मेमो शब्दकोश को दूसरे तर्क के रूप में कॉल करना चाहिए।

यह भी देखें

Module pickle
ऑब्जेक्ट राज्य पुनर्प्राप्ति और बहाली का समर्थन करने के लिए उपयोग किए जाने वाले विशेष तरीकों की चर्चा।