পাইথনে একটি পরিবর্তনশীল বস্তুর একটি রেফারেন্স মাত্র। তাই যখন এটি অন্য ভেরিয়েবলের সাথে বরাদ্দ করা হয়, তখন এটি বস্তুটিকে অনুলিপি করে না, বরং এটি একই বস্তুর আরেকটি রেফারেন্স হিসাবে কাজ করে। এটি id() ফাংশন
ব্যবহার করে যাচাই করা যেতে পারে>>> L1 = [1,2,3] >>> L2 = L1 >>> id(L1), id(L2) (2165544063496, 2165544063496)
উপরের কোডের ফলাফল দেখায় যে উভয় তালিকা অবজেক্টের জন্য id() একই, যার অর্থ উভয়ই একই বস্তুকে উল্লেখ করে। L2 কে L1 এর একটি অগভীর অনুলিপি বলা হয়। যেহেতু উভয়ই একই বস্তুকে নির্দেশ করে, তাই উভয়ের যেকোনো পরিবর্তন অন্য বস্তুতে প্রতিফলিত হবে।
>>> L1 = [1,2,3] >>> L2 = L1 >>> L2[1] = 100 >>> L1,L2 ([1, 100, 3], [1, 100, 3])
উপরের উদাহরণে, সূচক নম্বর আইটেম L2 এর 1 পরিবর্তন করা হয়েছে। আমরা দেখতে পাচ্ছি এই পরিবর্তন উভয়ের মধ্যেই দেখা যাচ্ছে।
যখন একটি সম্পূর্ণ নতুন অবজেক্ট তৈরি করা হয় কপি করার ক্রিয়াকলাপের সাথে, সাথে নেস্টেড অবজেক্টের কপিও এটিতে পুনরাবৃত্তভাবে যোগ করা হয়, সেই অনুলিপিটিকে বলা হয় গভীর অনুলিপি।
পাইথন স্ট্যান্ডার্ড লাইব্রেরির কপি মডিউল দুটি পদ্ধতি প্রদান করে:
- copy.copy() – একটি অগভীর অনুলিপি তৈরি করে
- copy.deepcopy() – একটি গভীর অনুলিপি তৈরি করে
একটি অগভীর অনুলিপি একটি নতুন বস্তু তৈরি করে এবং মূল উপাদানগুলির রেফারেন্স সংরক্ষণ করে কিন্তু নেস্টেড অবজেক্টের একটি অনুলিপি তৈরি করে না। এটি শুধু নেস্টেড অবজেক্টের রেফারেন্স কপি করে। ফলস্বরূপ, অনুলিপি প্রক্রিয়া পুনরাবৃত্তিমূলক নয়।
>>> import copy >>> L1 = [[1,2,3], [4,5,6]] >>> L2 = copy.copy(L1) >>> L1,L2 ([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]) >>> L2.append([10,10,10]) >>> L1,L2 ([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6], [10, 10, 10]])
এখানে L1 একটি নেস্টেড তালিকা এবং L2 হল এর অগভীর অনুলিপি। যদিও প্যারেন্ট লিস্ট অবজেক্টের রেফারেন্স L2 এ কপি করা হয়েছে, তবে এর নেস্টেড এলিমেন্ট কপি করা হয় না। তাই, যখন আমরা L2-এ অন্য একটি তালিকা যুক্ত করি, তখন এটি L1
-এ প্রতিফলিত হয় নাযাইহোক, যদি আমরা চাইল্ড এলিমেন্টে একটি উপাদান পরিবর্তন করার চেষ্টা করি, তাহলে উভয় তালিকাতেই এর প্রভাব দেখা যাবে
>>> L1 = [[1,2,3], [4,5,6]] >>> L2 = copy.copy(L1) >>> L1,L2 ([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]) >>> L2[1][0] = 100 >>> L1,L2 ([[1, 2, 3], [100, 5, 6]], [[1, 2, 3], [100, 5, 6]])
তবে একটি গভীর অনুলিপি একটি নতুন বস্তু তৈরি করে এবং মূল উপাদানগুলিতে উপস্থিত নেস্টেড অবজেক্টের অনুলিপিগুলিকেও বারবার যোগ করে৷
নিম্নলিখিত উদাহরণে, L2 হল L2 এর একটি গভীর অনুলিপি। এখন যদি আমরা অভ্যন্তরীণ তালিকার কোনো উপাদান পরিবর্তন করি, তবে এটি অন্য তালিকায় দেখাবে না।
>>> L1 = [[1,2,3], [4,5,6]] >>> L2 = copy.deepcopy(L1) >>> L1,L2 ([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]) >>> L2[1][0] = 100 >>> L1,L2 ([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [100, 5, 6]])
গভীর অনুলিপির প্রভাব এইভাবে আউটপুট দ্বারা যাচাই করা হয়।