python tutorial क्या पायथन में कोई वस्तु अद्वितीय पहचानकर्ता है




python tutorial (4)

यह java.lang.Object.hashcode () विधि के समान होगा।

मुझे उन वस्तुओं को संग्रहीत करने की आवश्यकता है जिनका मेरे पास एक सेट में कोई नियंत्रण नहीं है, और यह सुनिश्चित करें कि केवल दो वस्तुएं वास्तव में एक ही वस्तु हैं (समान मान शामिल नहीं हैं) क्या वे मान अधिलेखित होंगे


id(x)

तुम्हारे लिए चाल चलेगा। लेकिन मैं उत्सुक हूं, वस्तुओं के सेट के बारे में क्या गलत है (जो वस्तुओं को मूल्य से जोड़ती है)?

आपकी विशेष समस्या के लिए मैं शायद आईडी या रैपर ऑब्जेक्ट्स का सेट रखूंगा। एक आवरण ऑब्जेक्ट में एक संदर्भ होगा और x==y <==> x.ref is y.ref

यह भी ध्यान देने योग्य है कि पायथन ऑब्जेक्ट्स के पास एक hash फ़ंक्शन भी है। किसी फ़ंक्शन को किसी सेट या शब्दकोश में रखना आवश्यक है। इसे कभी-कभी विभिन्न वस्तुओं के लिए टकराना माना जाता है, हालांकि hash का अच्छा कार्यान्वयन इसे कम संभावना बनाने की कोशिश करता है।


Ilya n उल्लेखों के अनुसार, id (x) किसी वस्तु के लिए एक विशिष्ट पहचानकर्ता का निर्माण करता है।

लेकिन आपका सवाल भ्रामक है, क्योंकि जावा का हैशकोड विधि एक विशिष्ट पहचानकर्ता नहीं देता है। जावा का हैशकोड अधिकांश हैश फ़ंक्शन की तरह काम करता है: यह हमेशा एक ही वस्तु के लिए समान मान लौटाता है, दो वस्तुएं जो समान होती हैं उन्हें हमेशा समान कोड मिलते हैं, और असमान हैश मान असमान हैश कोड को प्रभावित करते हैं। विशेष रूप से, दो अलग और असमान वस्तुओं को समान मूल्य मिल सकता है।

यह भ्रामक है क्योंकि क्रिप्टोग्राफ़िक हैश फ़ंक्शंस इससे काफी अलग हैं, और अधिक (हालांकि बिल्कुल नहीं) "अद्वितीय आईडी" जिसे आपने मांगा था।

जावा के हैशकोड विधि के बराबर पायथन हैश (x) है।


आपको एक सेट में रखने से पहले वस्तुओं की तुलना करने की आवश्यकता नहीं है। सेट () शब्दार्थ पहले से ही इस बात का ध्यान रखता है।

   class A(object): 
     a = 10 
     b = 20 
     def __hash__(self): 
        return hash((self.a, self.b)) 

   a1 = A()
   a2 = A()
   a3 = A()
   a4 = a1
   s = set([a1,a2,a3,a4])
   s
=> set([<__main__.A object at 0x222a8c>, <__main__.A object at 0x220684>, <__main__.A object at 0x22045c>])

नोट: आपको वास्तव में इस व्यवहार को साबित करने के लिए हैश को ओवरराइड नहीं करना है :-)


यही " is " के लिए है।

" if a == b " परीक्षण के बजाय, जो समान मान के लिए परीक्षण करता है,

परीक्षण " if a is b ", जो उसी पहचानकर्ता के लिए परीक्षण करेगा।





python