2011-05-03 14 views
5

संपादित करें: मेरा बेवकूफ तर्क मेरे आगे हो गया। समझदारी कॉल से कोई भी रिटर्न नहीं है। ठीक है, मैं अजगर में कुछ परीक्षण चला रहा हूं, और मैं निष्पादन आदेशों में थोड़ा अंतर डालता हूं, जो मुझे यह समझने की ओर ले जाता है कि इसे कैसे कार्यान्वित किया जाता है, लेकिन मैं इसे आपके द्वारा ठीक लोगों को चलाने के लिए चाहता हूं देखें कि मैं सही हूं या इसके लिए और भी कुछ है।पायथन सूची समझ व्यवहार के लिए वीएस

>>> a = ["a","b","c","d","e"] 
>>> def test(self,arg): 
...  print "testing %s" %(arg) 
...  a.pop() 
... 
>>>[test(elem) for elem in a] 
testing a 
testing b 
testing c 
[None, None, None] 
>>> a 
['a', 'b'] 
#now we try another syntax 
>>> a = ["a","b","c","d","e"] 
>>> for elem in a: 
...  print "elem is %s"%(elem) 
...  test(elem) 
... 
elem is a 
testing a 
elem is b 
testing b 
elem is c 
testing c 
>>> a 
['a', 'b'] 
>>> 

अब इस मुझसे कहता है कि एक में ELEM के लिए: जबकि समझ किसी भी तरह वास्तव में कोड निष्पादित करने से पहले सूची के प्रत्येक तत्व पर फ़ंक्शन को कॉल हो जाता है अगले iteratable तत्व तो शरीर पर लागू होता है, इस कोड पर विचार करें फ़ंक्शन में, फ़ंक्शन (पॉप) से सूची को संशोधित करने से कोई भी नहीं, कोई नहीं, कोई नहीं]

क्या यह सही है? यहाँ क्या हो रहा है?

धन्यवाद

+2

'परीक्षण()' कुछ भी वापस नहीं करता है, इसलिए यह 'कोई नहीं' देता है। (बीटीडब्ल्यू, आपको 'स्वयं' पैरामीटर को हटाना चाहिए।) –

+0

हां, मैं बस खेल रहा हूं मैं देखना चाहता था कि वे वास्तव में समकक्ष थे ... लेकिन यहां निष्पादन आदेश के लिए कुछ है। – cromestant

+6

एक संग्रह का आकार बदलना (वस्तुओं को जोड़ना या हटाना) जबकि इसे फिर से चालू करना एक दंडनीय अपराध है। – delnan

उत्तर

4

आपके test फ़ंक्शन में return कथन नहीं है, इस प्रकार None एस की सूची में सूची समझ परिणामों में इसका उपयोग किया जाता है। इंटरैक्टिव पायथन प्रॉम्प्ट जो भी अंतिम बयान देता है उसे प्रिंट करता है।

उदाहरण:

तो सच में वहाँ में कोई अंतर नहीं है कैसे सूची समझ और अपने प्रश्न के काम में for पाश।

0

यह "c" को मिल गया है, तो सूची में तत्वों से बाहर भाग गया। test कुछ भी नहीं देता है, आपको [None, None, None] मिलते हैं।

1
>>> a = ["a","b","c","d","e"] 
>>> i = iter(a) 
>>> next(i) 
'a' 
>>> a.pop() 
'e' 
>>> next(i) 
'b' 
>>> a.pop() 
'd' 
>>> next(i) 
'c' 
>>> a.pop() 
'c' 
>>> next(i) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>>