2016-10-20 8 views
17

एक टपल पीछे और एक सूची पीछे रिटर्न विभिन्न प्रकार की वस्तुओं:एक उलटा हुआ टुपल और एक उल्टा सूची के बीच क्या अंतर है?

>>> reversed((1,2)) 
<reversed at 0x7fffe802f748> 
>>> reversed([1,2]) 
<list_reverseiterator at 0x7fffebdd4400> 

वे एक ही dir है। न तो प्रकार दूसरे का उप-वर्ग है।

वह क्यों है? कोई क्या कर सकता है कि दूसरा नहीं कर सकता?

+0

जब तक आप पाइथन के पुराने संस्करण का उपयोग नहीं कर रहे हैं, तब तक कोई अंतर बार प्रदर्शन नहीं होता है, जहां आप सूची-सूचीकर्ता पर लेन को कॉल कर सकते हैं। http://bugs.python.org/issue3689। –

उत्तर

12

मूल रूप से, एक सूची __reversed__ विधि को लागू करता है और एक विशेष वस्तु देता है, जबकि tuple किसी भी क्रम के लिए reversed के डिफ़ॉल्ट कार्यान्वयन के लिए वापस गिर जाता है:, अब

>>> list.__reversed__ 
<method '__reversed__' of 'list' objects> 
>>> tuple.__reversed__ 
AttributeError: type object 'tuple' has no attribute '__reversed__' 

क्यों सूची अनुक्रम reversed के लिए डिफ़ॉल्ट नहीं है ऑब्जेक्ट को सूची ऑब्जेक्ट के लिए स्रोत कोड में पाया जाना चाहिए - शायद यह आंतरिक कुछ list विशेषताओं तक पहुंचकर कुछ अनुकूलन को सक्षम बनाता है।

वास्तव में सी कोड को देखते हुए, वहाँ थोड़ा अंतर है, और निश्चित रूप से कुछ भी नहीं है कि आँख पकड़ता है -

मैं कहता हूँ विशेष सूची की हिम्मत होगी __reversed__ कार्यान्वयन Python2 दिनों से एक बचे हुए है जहां reversed वास्तव में किसी भी अन्य पायथन अनुक्रम को list पर कॉपी करेगा - इसलिए अन्य अनुक्रम के लिए कोई अर्थ नहीं होगा इसके लिए विशेष मामले हैं (और जब उन्होंने सामान्य enumreverse लागू किया था तो यह टुपल्स के लिए पर्याप्त था)।

मैं बहुत यकीन है कि अगर एक बस listobject.c पर __reversed__ स्लॉट बाहर टिप्पणी की, अजगर और उसके सूचियों कुछ भी नहीं है जैसे कि क्या हुआ था काम करेगा, सामान्य मामले reversed को दोषी हूँ।

+3

डिफ़ॉल्ट उलट: https://github.com/python/cpython/blob/master/Objects/enumobject।सी # एल 230 सूची उलट: https://github.com/python/cpython/blob/master/Objects/listobject.c#L2823 – BlackBear

+3

कोई ऐसा कर सकता है जो दूसरा नहीं कर सकता? – wim

+5

** गिथब प्रो-टिप **: यदि आप उस तरह ब्लॉब/मास्टर में लाइन नंबर से लिंक करते हैं, तो फ़ाइल को संशोधित होने पर लिंक रोट हो जाते हैं। इसके बजाए, इच्छित लाइनों को चुनें और फिर एक विशिष्ट प्रतिबद्धता के लिंक को पिन करने के लिए 'y' कुंजी दबाएं। फिर लाइन नंबर प्रासंगिक कोड से कभी नहीं हट जाएगा। मैंने आपके उत्तर में लिंक अपडेट कर दिए हैं। – wim

4

पायथन के documentation के अनुसार:

object.__reversed__(self)

कहा जाता है (यदि है) reversed() द्वारा निर्मित रिवर्स यात्रा को लागू करने। इसे एक नया इटरेटर ऑब्जेक्ट वापस करना चाहिए जो पर कंटेनर में सभी ऑब्जेक्ट्स को रिवर्स ऑर्डर में पुन: सक्रिय करता है।

तो __reversed__() विधि प्रदान नहीं की है, reversed() अंतर्निहित अनुक्रम प्रोटोकॉल (__len__() और __getitem__()) का उपयोग करना प्रारंभ कर देगा। अनुक्रम प्रोटोकॉल का समर्थन करने वाले ऑब्जेक्ट केवल __reversed__() प्रदान करना चाहिए यदि वे कार्यान्वयन प्रदान कर सकते हैं जो reversed() द्वारा प्रदान किए गए एक से अधिक कुशल है।

+3

यह अजीब लगता है कि सूची में एक अधिक कुशल कार्यान्वयन उपलब्ध होगा, लेकिन ट्यूपल नहीं करता है। – wim

+0

हाँ बिल्कुल: डी @ विम –

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