পাইথনের ডিফল্ট প্যারামিটার মান হ্যান্ডলিং এমন কিছু বিষয় যা অধিকাংশ নতুন পাইথন প্রোগ্রামারদের জন্য বিভ্রান্তিকর হতে পারে।
সমস্যা সৃষ্টি হয় যখন একটি মিউটেবল (পরিবর্তনযোগ্য) অবজেক্টকে ডিফল্ট মান হিসেবে ব্যবহার করা হয় — অর্থাৎ এমন একটি মান যা ইন-প্লেসে মডিফাই করা যায়, যেমন লিস্ট বা ডিকশনারি।
সমস্যাটি বুঝতে একটি উদাহরণ
নিচের কোডটি বিবেচনা করুন:
def func(data=[]):
data.append(1)
return data
func()
func()
আপনি আশা করতে পারেন যে প্রতিটি কলে একটি নতুন খালি লিস্ট তৈরি হবে, কিন্তু আসলে কী ঘটে?
- ফাংশন ডিফাইন হওয়ার সময় একবার একটি লিস্ট তৈরি হয়।
- এই একই লিস্টটি প্রতিটি ফাংশন কলে ব্যবহার হয়।
- ফলস্বরূপ, ডেটা জমা হয়ে যায় এবং অনপেক্ষিত আউটপুট দেয়।
সঠিক পদ্ধতি: None ব্যবহার করুন
প্রতিটি কলে নতুন অবজেক্ট তৈরি করতে, ডিফল্ট আর্গুমেন্ট হিসেবে None ব্যবহার করুন এবং ফাংশনের ভেতরে নতুন অবজেক্ট তৈরি করুন।
def append2(element, foo=None):
if foo is None:
foo = []
foo.append(element)
return foo
print(append2(12)) # আউটপুট: [12]
print(append2(43)) # আউটপুট: [43]
তথ্য সংক্ষেপে
- পাইথনে ডিফল্ট আর্গুমেন্টগুলি ফাংশন ডিফাইন হওয়ার সময় একবার ইভ্যালুয়েট হয়, প্রতিটি কলে না।
- মিউটেবল ডিফল্ট আর্গামেন্ট (লিস্ট, ডিকশনারি, সেট) ব্যবহার করলে সব কলের জন্য একই অবজেক্ট শেয়ার হয়।
- সমাধান: ডিফল্ট মান হিসেবে
Noneদিন এবং ফাংশনের ভেতরে নতুন অবজেক্ট তৈরি করুন।