2010-04-29 11 views
9

क्षमा करें अगर यह कोई समझ नहीं आता है, तो मैं पाइथन के लिए बहुत नया हूं!पायथन में एक सूची बनाना- कुछ चुस्त चल रहा है?

एक दुभाषिया में परीक्षण से, मैं देख सकता हूँ कि list() और [] दोनों एक खाली सूची का उत्पादन:

>>> list() 
[] 
>>> [] 
[] 

मैं अब तक क्या सीखा है से, एक ही रास्ता एक वस्तु बनाने के लिए कॉल करने के लिए है अपने कन्स्ट्रक्टर (__init__), लेकिन मुझे यह नहीं दिखाई देता है जब मैं बस [] टाइप करता हूं। तो [] निष्पादित करके, पाइथन तब मैपिंग को list() पर कॉल करने के लिए मैप कर रहा है?

+0

सभी उत्तरदाताओं के लिए धन्यवाद, जो वाकई चीजों को मंजूरी दे दी। पाइथन का उपयोग करने के आपके दूसरे दिन डाइविंग के लिए – GlenCrawford

उत्तर

6

नहीं है, अजगर list() फोन नहीं है, या आप सूची है, जो आप नहीं कर सकते बताए द्वारा प्रभावित हो सकता है कि किस प्रकार [] बनाता है:

>>> import __builtin__ 
>>> __builtin__.list = set 
>>> list() 
set([]) 
>>> [] 
[] 

[] एक सूची बनाने के लिए वाक्य रचना है। यह एक बिल्टिन प्रकार है और इसमें विशेष वाक्यविन्यास है, जैसे कि डिकट्स और स्ट्रिंग्स और इनट्स और फ्लोट्स और कई अन्य प्रकार। जो बदले में आप के लिए इस किस्म की निर्माता और प्रारंभकर्ता फोन करेगा - प्रकार के

बनाना उदाहरणों भी प्रकार, list() तरह बुला द्वारा किया जा कर सकते हैं। प्रारंभकर्ता को कॉल करना (__init__) सीधे प्रकार का एक नया उदाहरण बनाता है। कन्स्ट्रक्टर को कॉल करना (__new__) करता है, लेकिन आपको इसे सीधे कॉल नहीं करना चाहिए।

13

उन दो निर्माणों काफी अलग ढंग से नियंत्रित किया जाता है: जबकि list() रूप list वस्तु के निर्माता कॉल

>>> import dis 
>>> def f(): return [] 
... 
>>> dis.dis(f) 
    1   0 BUILD_LIST    0 
       3 RETURN_VALUE   
>>> def f(): return list() 
... 
>>> dis.dis(f) 
    1   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 RETURN_VALUE   
>>> 

[] फार्म, opcode BUILD_LIST का उपयोग कर एक सूची निर्माण करती है।

4

मैं कल अजगर सीखने शुरू कर दिया .... मुझे लगता है कि आप कहते हैं कि करने के लिए होता है अपने आंतरिक रूप से मैप किया

>>> a = [] 
>>> type(a) 
<type 'list'> 
>>> a = list() 
>>> type(a) 
<type 'list'> 
+1

+1! – PaulMcG

4

अन्य उत्तर के अलावा, Language Reference से:

सूची डिस्प्ले स्क्वायर ब्रैकेट्स में संलग्न अभिव्यक्तियों की संभावित रूप से खाली श्रृंखला है:

list_display  ::= "[" [expression_list | list_comprehension] "]" 
... 

एक सूची प्रदर्शन एक नई सूची वस्तु पैदा करता है।

यह स्पष्ट रूप से उल्लेख नहीं करता है कि "एक नई सूची वस्तु उत्पन्न करने" को कैसे लागू किया जाता है। यह आपके द्वारा उल्लेखित list() कन्स्ट्रक्टर के लिए एक कॉल हो सकता है। या शायद सूचियां, इतनी प्राथमिक होने के कारण, विशेष उपचार प्राप्त करें, और list() वास्तव में पूरी तरह से कुछ अलग करने के लिए मैप किया गया है।

किसी भी तरह से, [] निश्चित रूप से, प्रकार __builtins__.list नामित की निर्माता के लिए एक कॉल करने के लिए मैप नहीं है, क्योंकि उस प्रकार को पुनर्परिभाषित अभी भी [] का कारण बनता है एक वास्तविक सूची वापस जाने के लिए, के रूप में अन्य answerers से पता चला है।

3

पायथन, अधिकांश प्रोग्रामिंग लैंगुग की तरह, कुछ को अक्षर कहा जाता है, जिसका अर्थ है कि विशेष वाक्यविन्यास का उपयोग कुछ सबसे महत्वपूर्ण प्रकार के मूल्यों को लिखने के लिए किया जा सकता है। इसमें से बहुत कम आवश्यक है, लेकिन यह पाइथन का उपयोग करना आसान बनाता है कि हम अक्षर लिख सकते हैं।

>>> 0 
0 
>>> int() 
0 
>>> 5 
5 
>>> int('5') # I'm using a string literal here though! 
5 
>>> 0.0 
0.0 
>>> float() 
0.0 
>>> "" 
'' 
>>> str() 
'' 
>>> u"" 
u'' 
>>> unicode() 
u'' 
>>>() 
() 
>>> tuple() 
() 
>>> {} 
{} 
>>> dict() 
{}  

जब हम अपने ही प्रकार (वर्ग) करते हैं तो हम उनके निर्माताओं का उपयोग कर, सूचियों के लिए list की तरह उनमें से उदाहरण बना। जब हम अक्षर का उपयोग करते हैं, तो यह list पर कॉल करने के लिए सिंटैक्टिक चीनी की तरह है, लेकिन वास्तव में यह दृश्य के पीछे वही मूल चीजें कहता है।

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