परिवर्तनीय फ़ंक्शन आर्गुमेंट्स

Python में डेटा के कई प्रकार हैं, जिनमें से कुछ को बनाने के बाद बदला जा सकता है और कुछ को नहीं। जिन प्रकारों को बदला जा सकता है, उन्हें हम "म्यूटेबल" (परिवर्तनीय) प्रकार कहते हैं। इसके विपरीत, जिन्हें बदला नहीं जा सकता, उन्हें "इम्यूटेबल" (अपरिवर्तनीय) प्रकार कहा जाता है।

परिवर्तनशील प्रकार

सबसे सामान्य परिवर्तनशील प्रकार lists, dicts, और sets हैं। यहाँ एक list का उदाहरण है:
fruits = ['apple', 'banana', 'cherry']
print(fruits, type(fruits))  # ['apple', 'banana', 'cherry'] <class 'list'>
list के साथ, आप इसके एलिमेंट्स को बदल सकते हैं, नए जोड़ सकते हैं, या मौजूदा को हटा सकते हैं:
fruits[1] = 'blueberry'       # 'banana' को 'blueberry' से बदलें
fruits.append('dragonfruit')  # सूची के अंत में 'dragonfruit' जोड़ें
print(fruits)                 # ['apple', 'blueberry', 'cherry', 'dragonfruit']

अपरिवर्तनीय प्रकार

दूसरी ओर, ints, floats, strings, और tuples अपरिवर्तनीय प्रकार के उदाहरण हैं। एक बार बनाए जाने के बाद, आप उनके कंटेंट को बदल नहीं सकते। यहाँ एक string का उदाहरण है:
message = 'hello'
print(message, type(message))  # hello <class 'str'>
यदि आप string के किसी हिस्से को बदलने की कोशिश करते हैं, तो Python इसकी अनुमति नहीं देगा:
message[0] = 'H'  # 'h' को 'H' में बदलने का प्रयास करने से TypeError आएगा
int अपरिवर्तनीय कैसे है? क्या हम += या -= से मान को नहीं बदल सकते?
जब हम Python में म्युटेबलिटी की बात करते हैं, तो हमारा मतलब है कि स्मृति में संग्रहीत वास्तविक मान को बदला जा सकता है। उदाहरण के लिए, जब हमारे पास एक सूची है, हम सूची में एक आइटम को बदल सकते हैं, और यह स्मृति में वही सूची रहती है।
Python में पूर्णांक (integers) अपरिवर्तनीय होते हैं। इसका मतलब है कि स्मृति में मान को बदला नहीं जा सकता। अगर हमारे पास एक पूर्णांक a = 5 है, और हम a += 2 जैसा ऑपरेशन करते हैं, तो ऐसा लग सकता है कि हमने a को बदल दिया है। लेकिन वास्तव में, Python ने स्मृति में मान 7 के साथ एक नया ऑब्जेक्ट बनाया और a को इस नए ऑब्जेक्ट की ओर इंगित किया। मूल 5 को स्मृति में नहीं बदला गया - यही कारण है कि ints को Python में अपरिवर्तनीय माना जाता है।
a = 5
print(id(a))  # यह a का स्मृति स्थान प्रिंट करता है। मान लीजिए यह 1001 है

a += 2
print(a)      # यह 7 प्रिंट करता है
print(id(a))  # यह एक अलग स्मृति स्थान प्रिंट करेगा, मान लीजिए यह 1002 है
Python में id फ़ंक्शन किसी ऑब्जेक्ट की पहचान लौटाता है, जो उसके जीवनकाल के दौरान अद्वितीय और स्थिर होती है। तो जब हम देखते हैं कि a += 2 ऑपरेशन के बाद a की पहचान बदल गई, तो यह स्पष्ट संकेत है कि a अब स्मृति में एक नए ऑब्जेक्ट की ओर इंगित कर रहा है। मूल पूर्णांक 5 नहीं बदला गया था, जो यह पुष्टि करता है कि Python में पूर्णांक वास्तव में अपरिवर्तनीय हैं।

फ़ंक्शन्स में परिवर्तनशील आर्गुमेंट्स

जब हम एक परिवर्तनशील ऑब्जेक्ट (जैसे एक सूची) को फ़ंक्शन में पास करते हैं, तो Python उस ऑब्जेक्ट का संदर्भ फ़ंक्शन को देता है। इसका मतलब है कि अगर फ़ंक्शन इस परिवर्तनशील ऑब्जेक्ट को संशोधित करता है, तो यह संशोधन फ़ंक्शन के बाहर भी दिखाई देगा।
आइए एक ऐसा फ़ंक्शन इस्तेमाल करें जो एक सूची लेता है और उसमें एक आइटम जोड़ता है:
def add_item(my_list):
    my_list.append('added item')  # सूची में एक नया आइटम जोड़ें

shopping_list = ['apples', 'bananas', 'cherries']
print(shopping_list)  # प्रिंट करता है: ['apples', 'bananas', 'cherries']

# अब हम अपने शॉपिंग लिस्ट में एक आइटम जोड़ने के लिए फ़ंक्शन का उपयोग करते हैं
add_item(shopping_list)
print(shopping_list)  # प्रिंट करता है: ['apples', 'bananas', 'cherries', 'added item']
जैसा कि आप देख सकते हैं, add_item फ़ंक्शन को कॉल करने के बाद जब हमने shopping_list प्रिंट की, तो सूची में एक नया आइटम था। ऐसा इसलिए हुआ क्योंकि हमने फ़ंक्शन के बाहर सीधे shopping_list को संशोधित नहीं किया।
हालाँकि, यह समझना महत्वपूर्ण है कि यदि आप फ़ंक्शन के भीतर पूरे परिवर्तनशील ऑब्जेक्ट को एक नया मान असाइन करते हैं, तो यह मूल ऑब्जेक्ट को प्रभावित नहीं करेगा। ऐसा इसलिए है क्योंकि आप फ़ंक्शन के स्थानीय वेरिएबल को एक नया संदर्भ दे रहे हैं, न कि मूल ऑब्जेक्ट को संशोधित कर रहे हैं। आइए इसका एक उदाहरण देखें:
def change_list(my_list):
    my_list = ['entirely', 'new', 'list']  # यह मूल सूची को प्रभावित नहीं करेगा

shopping_list = ['apples', 'bananas', 'cherries']
change_list(shopping_list)
print(shopping_list)  # अभी भी प्रिंट करता है: ['apples', 'bananas', 'cherries']
भले ही हमने change_list फ़ंक्शन को shopping_list के साथ कॉल किया, shopping_list की सामग्री नहीं बदली। ऐसा इसलिए है क्योंकि फ़ंक्शन के अंदर, my_list को एक नए संदर्भ (पूरी तरह से नई सूची) के लिए सेट किया गया, जबकि shopping_list का संदर्भ अपरिवर्तित रहा।
मुख्य बात यह है: जब आप Python में एक परिवर्तनशील ऑब्जेक्ट को फ़ंक्शन में पास करते हैं, तो याद रखें कि यदि फ़ंक्शन ऑब्जेक्ट को संशोधित करता है (जैसे सूची में आइटम जोड़ना), तो परिवर्तन स्थायी है और फ़ंक्शन के बाहर दिखाई देगा। लेकिन अगर आप फ़ंक्शन के भीतर पूरे ऑब्जेक्ट को नया मान देते हैं, तो यह मूल ऑब्जेक्ट को प्रभावित नहीं करेगा।
 
To check your solution you need to sign in
Sign in to continue