Shared Reference and Equality Check

Shared Reference and Equality Check – जैसाकि हमने Garbage Collection Concept को Discuss करते समय पहले भी बताया था कि Python Small Integers व Strings की Memory को पूरी तरह से Release नहीं करता बल्कि इन छोटी Values को समान Python Program में ही फिर से जरूरत पड़ने पर Reuse करने के लिए Cache करके रखता है।

इसलिए जब हम पिछले Section में Specified Statement pyObject=12 करने के बाद अगले Statement में pyObject=’KRISHNA’ करते हैं, तब Python वास्‍तव में Integer Object 12 द्वारा Reserved Memory को पूरी तरह से Release नहीं करता, बल्कि इसे Cache में Save करके रख लेता है, ताकि यदि उसी Program के दौरान अगर फिर से Integer Object 12 की जरूरत पड़े, तो उसे फिर से Create न किया जाए, बल्कि Cache में Exist Integer Object 12 को ही फिर से Reuse कर लिया जाए।

जैसे ही किसी Object को कोई भी Variable Reference करना बन्‍द कर देता है, ज्‍यादातर प्रकार के Orphan Objects को Python द्वारा तुरन्‍त Reclaim कर लिया जाता है लेकिन Orphan होने के बावजूद जिन Objects को Python द्वारा Reclaim नहीं किया जाता, वे Python के Caching Mechanism का हिस्‍सा बन जाते हैं।

Python में मूल रूप से दो तरीकों के माध्‍यम से किन्‍हीं दो Objects को Equality के लिए Check किया जा सकता है। यानी इस बात को Check किया जाता है कि दोनों Objects एक जैसे हैं या नहीं। इन दोनों तरीकों को ठीक से समझने के लिए हम निम्‍नानुसार एक Example Program Create कर सकते हैं:

[code]
FileName: EqualityCheck.py
lst1 = [0, 1, 2, 3, 4]
lst2 = lst1

# After assigning same object with same Values
print("Same Value. lst1 == lst2?", lst1 == lst2)
print("Same Object. lst1 is lst2?", lst1 is lst2, "\n")

lst3 = [0, 1, 2, 3, 4]
lst4 = [0, 1, 2, 3, 4]

# After creating new object with Same Values
print("Same Value. lst3 == lst4?", lst3 == lst4)
print("Different Objects. lst3 is lst4?", lst3 is lst4)

Output
Same Value. lst1 == lst2? True
Same Object. lst1 is lst2? True
Same Value. lst3 == lst4? True
Different Objects. lst3 is lst4? False
[/code]

इस Example में हमने सबसे पहले Variable lst1 Create किया है और फिर इस lst2 में lst1 का Reference Assign कर दिया है। परिणामस्‍वरूप दोनों ही Objects समान Object का Reference Hold कर रहे हैं। इसलिए जब पहले print() Statement में Equality Operator (==) का प्रयोग करते हुए lst1 == lst2 किया, तो क्‍योंकि दोनों ही Variables समान Object को ही Reference कर रहे हैं, इसलिए ये Statement True Return कर देता है।

साथ ही जब अगले Statement में हमने “is” Statement का प्रयोग करते हुए lst1 is lst2 किया, तो उस स्थिति में भी हमें True ही Return होता है क्‍योंकि is Statement हमेंशा Variables में Stored References का Comparison करता है और lst2 = lst1 Statement के कारण lst1 व lst2 दोनों में समान Object का Reference ही Stored है।

लेकिन जब हम इसी प्रक्रिया को दो अन्‍य Objects lst3 व lst4 Create करके फिर से Apply करते हैं, तब lst3==lst4 के माध्‍यम से तीसरा print() Statement True ही Return करता है क्‍योंकि इस Statement में lst3lst4 में Exist Data Items का Comparison होता है और दोनों Variables द्वारा Referenced Objects में एक समान Data Items ही हैं क्‍योंकि दोनों Variables एक ही Object को Reference कर रहे हैं।

लेकिन जब अन्तिम print() Statement Execute होता है, lst3 is lst4 के माध्‍यम से lst3 व lst4 दोनों Variables में Stored References का Comparison होता है और हालांकि दोनों Variables में Stored References वाले Objects में सभी Values एक समान हैं, फिर भी दोनों Variables दो अलग Objects से Linked हैं और दो अलग Objects को Reference कर रहे हैं, इसलिए अन्तिम print() Statement False Return करता है क्‍योंकि “is” Statement हमेंशा Variables में Stored References को Compare करता है।

Python हमें ये सुविधा देता है कि हम sys Module में Defined getrefcount() Method का प्रयोग करके किसी भी समय इस बात का पता लगा सकते हैं कि किसी Object को Currently कितने Variables Reference कर रहे हैं। इस function को हम निम्‍नानुसार तरीके से Use कर सकते हैं-

[code]
FileName: ReferenceCount.py
import sys
print("References to Integer Object 12:", sys.getrefcount(12))
print("References to Integer Object 1:", sys.getrefcount(1))
print()
lst = [1,2,3,3]
print("References to List Object lst:", sys.getrefcount(lst))
str = 'KRISHNA'
print("References to String Object str:", sys.getrefcount(str))

Output
References to Integer Object 12: 10
References to Integer Object 1: 98
References to List Object lst: 2
References to String Object str: 4
[/code]

जब हम getrefcount() Function को Use करके Integer Object 1 को Point करने वाले References को Count करते हैं, तो उसमें वे Pointers भी शामिल होते हैं, जो Object 12 को Point कर रहे हैं।

साथ ही जब तक हम “is” Check नहीं करते, तब तक इस बात से कोई फर्क नहीं पड़ता कि कितने Objects Memory में Cached हैं और getrefcount() Function, Cached Objects का Counting Return कर रहा है क्‍योंकि हम Immutable Numbers या Strings को In-Place Change नहीं कर सकते। इसलिए इस बात से कोई फर्क नहीं पड़ता कि Same Object को कितने References Point कर रहे हैं, बल्कि सभी References समान Unchanging Value को ही देखेंगे और Python इन्‍हीं तरीकों को Use करते हुए ही अपनी Performance को Optimize करता है।

Shared Reference and In-Place Change
What is Unicode?

Python in Hindi - BccFalna.comये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Python in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।

Python in Hindi | Page: 602 | Format: PDF

BUY NOW GET DEMO REVIEWS