2011-05-03 64 views
5

編輯:我的愚蠢邏輯超過了我。沒有一個是來自理解呼叫的回報。 好吧,我正在python中運行一些測試,並且我在執行順序中遇到了一些差異,這導致我理解它是如何實現的,但是我想讓你很好地運行它以看看我是對的還是還有更多。考慮以下代碼:python list comprehension VS行爲

>>> 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在:獲取下一個可重複的元素然後應用體,而理解實際執行代碼之前以某種方式調用列表中的每個元素的功能在函數中,所以從函數(彈出)修改列表導致] none,none,none]

這是正確的嗎?這裏發生了什麼?

感謝

+2

'test()'不返回任何內容,因此它返回'None'。 (順便說一句,你應該刪除'self'參數。) – 2011-05-03 14:46:58

+0

是的,我只是在玩耍,我想看看它們是否真的相當......但是這裏有一些執行順序。 – cromestant 2011-05-03 14:48:55

+6

重複調整集合的大小(添加或刪除項目)是一種應受懲罰的攻擊。 – delnan 2011-05-03 14:49:35

回答

4

您的test函數沒有return聲明,因此在列表理解中使用它會得到一列None s。交互式Python提示符輸出最後一條語句返回的內容。

例子:

所以真的有一個在沒有區別如何在列表理解和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 
>>> 
相關問題