पायथन में असाइनमेंट (=) ऑब्जेक्ट कॉपी नहीं करता, केवल रेफरेंस बनाता है। वास्तविक कॉपी के लिए copy मॉड्यूल उपयोग करें।
असाइनमेंट vs कॉपी
L1 = [1, 2, 3]
L2 = L1 # असाइनमेंट: समान ऑब्जेक्ट
print(id(L1), id(L2)) # समान ID
L2[1] = 100
print(L1, L2) # [1, 100, 3] [1, 100, 3] - दोनों बदले!
copy मॉड्यूल
copy.copy(): शैलो कॉपी - नया ऑब्जेक्ट, लेकिन नेस्टेड ऑब्जेक्ट्स के रेफरेंस कॉपी करता है।copy.deepcopy(): डीप कॉपी - नया ऑब्जेक्ट, नेस्टेड ऑब्जेक्ट्स को रिकर्सिवली कॉपी करता है।
शैलो कॉपी
import copy
L1 = [[1, 2, 3], [4, 5, 6]]
L2 = copy.copy(L1)
print(L1, L2) # दोनों [[1,2,3], [4,5,6]]
# टॉप-लेवल जोड़ना: केवल L2 प्रभावित
L2.append([10, 10, 10])
print(L1) # [[1,2,3], [4,5,6]]
print(L2) # [[1,2,3], [4,5,6], [10,10,10]]
# नेस्टेड मॉडिफिकेशन: दोनों प्रभावित!
L2[1][0] = 100
print(L1) # [[1,2,3], [100,5,6]] <-- बदला!
print(L2) # [[1,2,3], [100,5,6]]
डीप कॉपी
L1 = [[1, 2, 3], [4, 5, 6]]
L2 = copy.deepcopy(L1)
L2[1][0] = 100
print(L1) # [[1,2,3], [4,5,6]] <-- अपरिवर्तित
print(L2) # [[1,2,3], [100,5,6]]
तुलना तालिका
| ऑपरेशन | नया ऑब्जेक्ट? | नेस्टेड ऑब्जेक्ट्स | उपयोग केस |
|---|---|---|---|
असाइनमेंट (=) | नहीं | साझा | अलियासिंग |
| शैलो कॉपी | हाँ (टॉप-लेवल) | साझा (रेफरेंस) | फ्लैट स्ट्रक्चर्स, परफॉरमेंस |
| डीप कॉपी | हाँ (रिकर्सिव) | कॉपी (स्वतंत्र) | नेस्टेड स्ट्रक्चर्स, पूर्ण आइसोलेशन |
कब क्या उपयोग करें?
- शैलो कॉपी: जब नेस्टेड ऑब्जेक्ट्स इम्यूटेबल हों (टपल्स, स्ट्रिंग्स, नंबर्स) या आप शेयर्ड स्टेट चाहते हों।
- डीप कॉपी: जब नेस्टेड म्यूटेबल ऑब्जेक्ट्स हों और पूर्ण स्वतंत्रता चाहिए।
- कस्टम ऑब्जेक्ट्स:
__copy__()और__deepcopy__()मेथड्स परिभाषित करके व्यवहार नियंत्रित करें।
कस्टम क्लास उदाहरण
import copy
class MyClass:
def __init__(self, value):
self.value = value
def __copy__(self):
print("__copy__ called")
return MyClass(self.value)
def __deepcopy__(self, memo):
print("__deepcopy__ called")
return MyClass(copy.deepcopy(self.value, memo))
obj = MyClass([1, 2, 3])
obj2 = copy.copy(obj) # __copy__ called
obj3 = copy.deepcopy(obj) # __deepcopy__ called