2011-06-06 14 views
8

पायथन 2.7 में, मैं एक खाली नई शैली की कक्षा को परिभाषित करता हूं:पायथन: डिफ़ॉल्ट तुलना

In [43]: class C(object): pass 
    ....: 

फिर नई कक्षा के उदाहरणों की एक सूची बनाएं:

In [44]: c = [C() for i in xrange(10)] 

फिर सूची को क्रमबद्ध करने का प्रयास करें:

In [45]: sorted(c) 
Out[45]: 
[<__main__.C object at 0x1950a490>, 
<__main__.C object at 0x1950a4d0>, 
... 
<__main__.C object at 0x1950aad0>] 

आश्चर्य की बात यह है कि सॉर्ट शिकायत नहीं करता है, भले ही मैंने C के उदाहरणों की तुलना करने के लिए कोई तरीका परिभाषित नहीं किया है:

In [46]: dir(C()) 
Out[46]: 
['__class__', 
'__delattr__', 
'__dict__', 
'__doc__', 
'__format__', 
'__getattribute__', 
'__hash__', 
'__init__', 
'__module__', 
'__new__', 
'__reduce__', 
'__reduce_ex__', 
'__repr__', 
'__setattr__', 
'__sizeof__', 
'__str__', 
'__subclasshook__', 
'__weakref__'] 

वास्तव में क्या हो रहा है, और इसके लिए तर्क क्या है - - तर्कसंगत आश्चर्यजनक - व्यवहार?

उत्तर

14

मुझे लगता है कि एकमात्र तर्क यह है कि यह सुविधाजनक है कि ऑब्जेक्ट्स को सॉर्ट किया जा सकता है और उदा। कुछ डिफ़ॉल्ट व्यवहार के साथ शब्दकोश कुंजी के रूप में प्रयोग किया जाता है। भाषा परिभाषा में प्रासंगिक अध्याय यहां है: https://docs.python.org/2/reference/expressions.html#not-in

"यह विकल्प कि एक ऑब्जेक्ट को किसी दूसरे से छोटा या बड़ा माना जाता है, वह एक कार्यक्रम के निष्पादन के भीतर मनमाने ढंग से लेकिन लगातार बना दिया जाता है।"

तो तथ्य यह है कि वर्तमान में स्मृति पते का उपयोग करके वस्तुओं की तुलना की जाती है, केवल एक कार्यान्वयन विवरण है जिस पर गणना नहीं की जा सकती है। एकमात्र गारंटी यह है कि आदेश निष्पादन के दौरान लगातार रहता है।

+0

(+1)। – NPE

+0

+1, आप अपनी टिप्पणी में पूरी तरह से सही थे, मैं दो ऑब्जेक्ट और अन्य तुलना ऑपरेटर की समानता से गुमराह था, मेरी गलती को जानने के लिए धन्यवाद – mouad

+0

अपडेट किया गया लिंक http://docs.python.org/reference/expressions.html #अंदर नही –

0

जब आप इसे प्रिंट करते हैं तो मूल्यों को देखें। "ऑब्जेक्ट सी पर" के बगल में हेक्स नंबर पर ध्यान दें? यह एक सूचक संदर्भ है। यह मोटे तौर पर निर्माण आदेश के बराबर किया जा सकता है। यदि आप उस सूची के माध्यम से पुन: प्रयास करते हैं, तो आप देखेंगे कि उसने ऑब्जेक्ट को मानक के रूप में उपयोग किया है।

एक साइड नोट के रूप में, मुझे पाइथन 2.x तुलना द्वारा confused होने की याद आती है ... लेकिन मुझे नहीं पता कि यह विशेष रूप से, Py3k में तय किया गया था या नहीं।

+0

हाँ, मैंने देखा है। लेकिन तर्क क्या है? – NPE

+1

@aix संपादन देखें। पायथन <3 तुलना लगभग परेशान आसान है। Http://stackoverflow.com/questions/4266918/why-is-int50str5-in-python-2-x – cwallenpoole

+0

तर्क यह है कि पाइथन में वेरिएबल ढेर में ऑब्जेक्ट्स के संदर्भ हैं। मेमोरी एड्रेस द्वारा ऑर्डर करना शायद डिफ़ॉल्ट व्यवहार को लागू करने के लिए सबसे आसान था, जिसमें पाइथन डेवलपर्स सोच सकते थे। –

1

मुझे बिल्कुल यकीन नहीं है, लेकिन शायद कोई इस पर मुझे सही कर सकता है।

जब आप वस्तुओं की तुलना करते हैं, तो यह उनके स्मृति पते की तुलना करता है, सी में 2 cstrings की तुलना करने के बारे में सोचें। यदि आप एक नज़र डालें, तो सॉर्टिंग ने ऑब्जेक्ट को सबसे कम स्मृति पते से उच्चतम मेमोरी एड्रेस (या पॉइंटर स्थान) में क्रमबद्ध किया।

+0

दरअसल, लेकिन क्या यह थोड़ा मनमानी और इसलिए गैर-पायथनिक नहीं लगता है? – NPE

+0

ठीक है, अंतर्निहित सी कोड में, जब आप 2 ऑब्जेक्ट की तुलना करते हैं, तो यह केवल 2 पूर्णांक की तुलना कर रहा है, जो ऑब्जेक्ट को संग्रहीत करने वाली स्मृति को इंगित करता है, और हम सभी जानते हैं कि पूर्णांक तुलना कैसे काम करती है। लिंक और उद्धरण के लिए – Pwnna

संबंधित मुद्दे