পাইথনে ডিকশনারি কপি করার সময় শ্যালো (shallow) এবং ডিপ (deep) কপির পার্থক্য বোঝা অত্যন্ত গুরুত্বপূর্ণ, অন্যথায় অপ্রত্যাশিত বাগ হতে পারে।
উদাহরণ: শ্যালো কপি (copy() বা dict())
original = {1: 'vishesh', 2: 'python'}
# পদ্ধতি ১: copy() মেথড
new = original.copy()
new.clear()
print('new:', new) # {}
print('original:', original) # {1: 'vishesh', 2: 'python'} → অপরিবর্তিত
# পদ্ধতি ২: dict() কনস্ট্রাক্টর
new2 = dict(original)
new2.clear()
print('new2:', new2) # {}
print('original:', original) # অপরিবর্তিত
উদাহরণ: এসাইনমেন্ট (=) — কপি নয়, রেফারেন্স!
original = {1: 'one', 2: 'two'}
new = original # এটি কপি নয়, একই অবজেক্টের নতুন নাম
new.clear()
print('new:', new) # {}
print('original:', original) # {} → মূলটিও খালি হয়ে গেলো!
নেস্টেড ডিকশনারির কেসে সমস্যা
original = {'a': [1, 2, 3], 'b': {'x': 10}}
shallow = original.copy()
shallow['a'].append(4) # নেস্টেড লিস্ট পরিবর্তন → মূলটিও বদলাবে!
shallow['b']['x'] = 20 # নেস্টেড ডিকশনারি পরিবর্তন → মূলটিও বদলাবে!
print('original:', original) # {'a': [1, 2, 3, 4], 'b': {'x': 20}}
সমাধান: copy.deepcopy() ব্যবহার করুন
import copy
original = {'a': [1, 2, 3], 'b': {'x': 10}}
deep = copy.deepcopy(original)
deep['a'].append(4)
deep['b']['x'] = 20
print('original:', original) # {'a': [1, 2, 3], 'b': {'x': 10}} → নিরাপদ
print('deep:', deep) # {'a': [1, 2, 3, 4], 'b': {'x': 20}}
তুলনা টেবিল
| পদ্ধতি | প্রकार | নেস্টেড অবজেক্ট | ব্যবহার |
|---|---|---|---|
= (এসাইনমেন্ট) | রেফারেন্স | শেয়ার করা | কপি নয়, এড়িয়ে চলুন |
dict.copy() | শ্যালো | শেয়ার করা | ফ্ল্যাট ডিকশনারির জন্য ঠিক |
dict(original) | শ্যালো | শেয়ার করা | copy() এর সমতুল্য |
copy.deepcopy() | ডিপ | স্বতন্ত্র কপি | নেস্টেড ডেটার জন্য আবশ্যক |
স্মরণীয়: শ্যালো কপি শুধু প্রথম লেয়ারের কী-ভ্যালু কপি করে। নেস্টেড মিউটেবল অবজেক্ট (লিস্ট, ডিকশনারি, সেট) উভয় ডিকশনারি শেয়ার করে। ডিপ কপি সম্পূর্ণ স্বতন্ত্র ক্লোন তৈরি করে।