উত্তর: হ্যাঁ
প্রতিটি ফাংশন কল (রিকারসিভ হোক বা না) একটি নতুন লোকাল নেমস্পেস তৈরি করে।
কিভাবে কাজ করে
- ইন্টারপ্রেটার ফাংশন কল দেখলে একটি ফ্রেম অবজেক্ট তৈরি করে
- ফ্রেমটি ফ্রেম স্ট্যাক-এ পুশ হয়
- প্রতিটি ফ্রেমের নিজস্ব প্রাইভেট নেমস্পেস থাকে
- ফাংশন রিটার্ন হলে ফ্রেম পপ হয় এবং নেমস্পেস ডিসকার্ড হয়
গুরুত্বপূর্ণ: অবজেক্ট রেফারেন্স
প্যারামিটার হিসেবে অবজেক্ট পাস করলে রেফারেন্স পাস হয় (কল-বাই-অবজেক্ট-রেফারেন্স)।
- নতুন নেমস্পেসে রেফারেন্সের কপি থাকে
- কিন্তু একই অবজেক্টকে পয়েন্ট করে
- মিউটেবল অবজেক্ট (লিস্ট, ডিক্ট) পরিবর্তন করলে কলিং ফাংশনেও প্রতিফলিত হয়
উদাহরণ
def recursive(lst, n):
print(f"Call {n}: id(lst)={id(lst)}")
if n > 0:
lst.append(n)
recursive(lst, n-1)
my_list = []
recursive(my_list, 3)
print(my_list) # [3, 2, 1] - একই লিস্ট অবজেক্ট মিউটেট হয়েছে
সারসংক্ষেপ
- প্রতিটি কল = নতুন নেমস্পেস (নতুন ফ্রেম)
- ইমিউটেবল অবজেক্ট (int, str, tuple): কপি जैसा আচরণ
- মিউটেবল অবজেক্ট (list, dict): একই অবজেক্ট শেয়ার, পরিবর্তন দৃশ্যমান