2011-05-03 4 views
5

편집 : 내 앞에서 어리석은 논리가 나왔습니다. 아무도 이해력의 호출로부터의 반환 일뿐입니다. 좋아, 파이썬에서 몇 가지 테스트를 실행하고 실행 순서의 차이점에 약간의 차이가있어서 구현 방법을 이해할 수 있지만 훌륭한 사용자가 실행하도록하고 싶습니다. 내가 옳은지 아니면 더 많이 있는지보십시오. 이해력이 어떻게 든 실제로 코드를 실행하기 전에 목록의 각 요소에 대해 함수를 호출하는 반면, 다음 iteratable 요소는 다음 몸을 적용 가져옵니다행동에 대한 파이썬 목록 이해 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의가 있음을 알려줍니다 :이 코드를 고려 함수 (pop)에서 목록을 수정하면 [none, none, none]이됩니다.

이게 맞습니까? 여기서 무슨 일이 일어나고있는거야?

덕분에

+2

'test()'는 아무것도 반환하지 않으므로'None'을 반환합니다. (BTW, 당신은'self' 매개 변수를 삭제해야합니다.) –

+0

예, 저는 주위를 놀고 있습니다. 만약 그들이 정말로 동등한 지 알고 싶었지만 ... 여기에 실행 명령에 뭔가가 있습니다. – cromestant

+6

컬렉션을 반복하는 동안 (항목 추가 또는 삭제) 컬렉션의 크기를 변경하면 처벌 될 수 있습니다. – delnan

답변

4

test 함수에는 return 문이 없으므로 목록 이해에 사용하면 None의 목록이됩니다. 대화식 파이썬 프롬프트는 마지막 명령문이 반환하는 것을 인쇄합니다.

예 :

>>> def noop(x): pass 
... 
>>> [noop(i) for i in range(5)] 
[None, None, None, None, 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 
>>>