জিআইএসটি নেওয়ার বিষয়টি হ'ল: "সাধারণ অ্যাসাইনমেন্ট" ব্যবহার করে অগভীর তালিকাগুলি (সাব-লিস্ট নয়, কেবলমাত্র একক উপাদান) ব্যবহার করা যখন আপনি অগভীর তালিকা তৈরি করেন তখন আপনি "সাধারণ অ্যাসাইনমেন্ট" ব্যবহার করে এই তালিকার একটি অনুলিপি তৈরি করেন । আপনি তৈরি অনুলিপি তালিকার কোনও উপাদান পরিবর্তন করলে এই "পার্শ্ব প্রতিক্রিয়া" হয়, কারণ এটি স্বয়ংক্রিয়ভাবে মূল তালিকার একই উপাদানগুলিকে পরিবর্তন করবে change এটি তখন কার্যকর হয় যখন 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
পরীক্ষা চালানো যাক এবং আসল তালিকাটি এর অনুলিপি তালিকার তুলনায় কী আচরণ করে:
আসল_লিস্ট এবং কপি_লিস্টের আলাদা ঠিকানা রয়েছে
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
অরিজিনাল লিস্ট উপাদানগুলিকে সংশোধন করা অনুলিপি-তালিকার উপাদানগুলিকে পরিবর্তন করে না
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.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[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)
আসল_লিস্ট এবং কপি_লিস্টের আলাদা ঠিকানা রয়েছে
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
অরিজিনাল লিস্ট উপাদানগুলিকে সংশোধন করা অনুলিপি-তালিকার উপাদানগুলিকে পরিবর্তন করে না
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.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[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]