लेने के लिए GIST यह है: "सामान्य असाइनमेंट" का उपयोग करके उथली सूचियों (कोई भी उप-कलाकार, सिर्फ एक तत्व) के साथ व्यवहार करना "उथल-पुथल" पैदा करता है जब आप उथली सूची बनाते हैं और तब आप इस सामान्य असाइनमेंट का उपयोग करके इस सूची की एक प्रति बनाते हैं। । यह "दुष्प्रभाव" तब होता है जब आप बनाई गई प्रतिलिपि सूची के किसी भी तत्व को बदलते हैं, क्योंकि यह स्वचालित रूप से मूल सूची के समान तत्वों को बदल देगा। जब copy
यह काम आता है, क्योंकि यह कॉपी तत्वों को बदलते समय मूल सूची तत्वों को नहीं बदलेगा।
दूसरी ओर, copy
एक "साइड इफेक्ट" भी होता है, जब आपके पास एक सूची होती है, जिसमें सूची (उप_सूची) होती है, और deepcopy
इसे हल करती है। उदाहरण के लिए यदि आप एक बड़ी सूची बनाते हैं, जिसमें नेस्टेड सूची (सब_लिस्ट) होती है, और आप इस बड़ी सूची (मूल सूची) की एक प्रति बनाते हैं। "साइड इफेक्ट" तब उत्पन्न होगा जब आप कॉपी सूची के उप_वादियों को संशोधित करेंगे जो स्वचालित रूप से बड़ी सूची के उप_वादियों को संशोधित करेगा। कभी-कभी (कुछ परियोजनाओं में) आप बड़ी सूची (आपकी मूल सूची) रखना चाहते हैं, क्योंकि यह संशोधन के बिना है, और आप सभी चाहते हैं कि इसके तत्वों (सब_लिस्ट्स) की एक प्रतिलिपि बनाई जाए। उसके लिए, आपके समाधान का उपयोग करना है deepcopy
जो इस "साइड इफेक्ट" का ध्यान रखेगा और मूल सामग्री को संशोधित किए बिना एक प्रतिलिपि बनाता है।
के विभिन्न व्यवहार copy
और deep copy
संचालन केवल यौगिक वस्तुओं की चिंता करते हैं (यानी: ऐसी वस्तुएं जिनमें सूची जैसी अन्य वस्तुएं होती हैं)।
इस सरल कोड उदाहरण में सचित्र अंतर हैं:
प्रथम
आइए देखें कि copy
मूल सूची और इस सूची की प्रतिलिपि बनाकर (उथला) कैसे व्यवहार करता है:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
अब, कुछ print
परीक्षण चलाते हैं और देखते हैं कि इसकी प्रतिलिपि सूची की तुलना में मूल सूची कैसे व्यवहार करती है:
original_list और copy_list के अलग-अलग पते हैं
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
मूल_सूची और कॉपी_लिस्ट के तत्वों के पते समान हैं
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
मूल_सूची और कॉपी_सूची के उप-पते एक ही पते के होते हैं
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
मूल_सूची तत्वों को संशोधित करना copy_list तत्वों को संशोधित नहीं करता है
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
copy_list तत्वों को संशोधित करना original_list तत्वों को संशोधित नहीं करता है
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
मूल_सूची उप_सूची को संशोधित करके स्वचालित रूप से प्रतिलिपि_सूची उप_सूची को संशोधित करता है
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
copy_list sub_elements को स्वचालित रूप से मूल_लिस्ट sub_elements संशोधित करता है
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
दूसरा
आइए देखें कि हम कैसे deepcopy
व्यवहार करते हैं, जैसा कि हमने किया था copy
(एक मूल सूची और इस सूची की एक प्रति बनाकर):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
अब, कुछ print
परीक्षण चलाते हैं और देखते हैं कि इसकी प्रतिलिपि सूची की तुलना में मूल सूची कैसे व्यवहार करती है:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list और copy_list के अलग-अलग पते हैं
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
मूल_सूची और कॉपी_लिस्ट के तत्वों के पते समान हैं
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
मूल_सूची और प्रतिलिपि_सूची के उप_ अलग-अलग पते हैं
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
मूल_सूची तत्वों को संशोधित करना copy_list तत्वों को संशोधित नहीं करता है
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
copy_list तत्वों को संशोधित करना original_list तत्वों को संशोधित नहीं करता है
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
मूल_सूची उप_ संशोधनों को संशोधित करना प्रतिलिपि_सूची उप_सूची को संशोधित नहीं करता है
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
copy_list sub_elements को संशोधित करने से original_list उप_सूची को संशोधित नहीं किया जाता है
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]