2016-02-25 11 views
6

यह प्रश्न PEP 448 -- Additional Unpacking Generalizations से उत्पन्न होते हैं और पाइथन 3.5 में मौजूद हैं, जहां तक ​​मुझे पता है (और 2.x पर बैक-पोर्ट नहीं किया गया है)। विशेष रूप से, खंड नुकसान में, निम्नलिखित का उल्लेख किया जाता है:स्टार * ऑपरेटर एक असाइनमेंट स्टेटमेंट के बाएं बनाम दाहिने तरफ

जबकि *elements, = iterable कारणों elements एक list, elements = *iterable होने के लिए, elements का कारण बनता है एक tuple किया जाना है। इसका कारण लोगों को निर्माण से अपरिचित लोगों को भ्रमित कर सकता है।

कौन वास्तव में iterable = [1, 2, 3, 4] के लिए पकड़ है,, पहले मामले पैदावार एक list:

>>> *elements, = iterable 
>>> elements 
[1, 2, 3, 4] 

जबकि दूसरे मामले में एक tuple बनाई गई है के लिए:

>>> elements = *iterable, 
>>> elements 
(1, 2, 3, 4) 

अवधारणा के साथ अपरिचित होने के नाते , मैं उलझन में हूं। क्या कोई इस व्यवहार को समझा सकता है? क्या तारांकित अभिव्यक्ति अलग-अलग पक्ष के आधार पर कार्य करती है?

उत्तर

6

विस्तारित अनपॅकिंग के लिए शुरुआती पीईपी को ध्यान में रखते हुए इन दो मामलों के बीच अंतर समझाया गया है: PEP 3132 -- Extended iterable unpacking

सार में पीईपी के लिए हम देख सकते हैं:

यह पीईपी एक परिवर्तन वाक्य रचना खोल Iterable करने के लिए, एक "कैच-ऑल" नाम जो एक सूची आवंटित किया जाएगा निर्दिष्ट करने की अनुमति का प्रस्ताव सभी आइटमों को "नियमित" नाम से असाइन नहीं किया गया है।

(जोर मेरा)

पहला मामला में तो, को क्रियान्वित करने के बाद:

*elements, = iterable 

elements हमेशा एक list में सभी आइटम युक्त होने जा रहा है iterable

हालांकि यह दोनों मामलों में समान लगता है, इस मामले में * का अर्थ है: किसी भी नाम को निर्दिष्ट नहीं किया गया है और इसे तारांकित अभिव्यक्ति को असाइन करें। यह *args और **kwargsफ़ंक्शन परिभाषा में समान रूप से काम करता है।

def spam(*args, **kwargs): 
    """ args and kwargs group positional and keywords respectively """ 

दूसरे मामले (दाईं ओर) कुछ अलग है। यहां हमारे पास * "कैच सब कुछ" तरीके से काम नहीं कर रहा है जितना हम इसे काम करते हैं क्योंकि यह आमतौर पर फ़ंक्शन कॉल पर करता है। यह उस पुनरावर्तनीय सामग्रियों का विस्तार करता है जो इसे संलग्न करता है।तो, बयान:

elements = 1, 2, 3, 4, 

जिसके लिए एक tuple प्रारंभ करने के लिए एक और तरीका है:

elements = *iterable, 

के रूप में देखा जा सकता है।

Do ध्यान दें, एक listelements = [*iterable] का उपयोग कर जो [] में iterable की सामग्री को खोल और फार्म elements = [1, 2, 3, 4] के कार्य का परिणाम देगा सरल द्वारा बनाई जा सकती है।

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