পাইথনে একটি ভেরিয়েবল কেবল একটি অবজেক্টের রেফারেন্স। সুতরাং যখন এটি অন্য ভেরিয়েবলে অ্যাসাইন করা হয়, এটি অবজেক্টটি কপি করে না, বরং এটি একই অবজেক্টের অন্য একটি রেফারেন্স হিসেবে কাজ করে। এটি 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-র ইনডেক্স নম্বর ১-এ আইটেম পরিবর্তন করা হয়েছে। আমরা এই পরিবর্তন দুটোতেই দেখতে পাচ্ছি।
যখন একটি কপি অপারেশন দিয়ে একটি সম্পূর্ণ নতুন অবজেক্ট তৈরি হয়, নেস্টেড অবজেক্টের কপিও রিকার্সিভলি এড হয়, তখন সেই কপিকে ডিপ কপি বলা হয়।
পাইথন স্ট্যান্ডার্ড লাইব্রেরির copy মডিউল দুটি মেথড প্রদান করে:
- 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]])
একটি ডিপ কপিöse, একটি নতুন অবজেক্ট তৈরি করে এবং মূল এলিমেন্টগুলোর নেস্টেড অবজেক্টের কপিও রিকার্সিভলি যোগ করে।
নিচের উদাহরণে, L2, L1-র একটি ডিপ কপি। এখন যদি আমরা ইনার লিস্টের যেকোনো এলিমেন্ট পরিবর্তন করি, এটি অন্য লিস্টে দেখাবে না।
>>> 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]])
আউটপুট দিয়ে ডিপ কপির প্রভাব ভেরিফাই করা যাচ্ছে।