2016-06-01 2 views
1

파이썬에서 호출 가능 목록을 반복하는 데 문제가 있습니다. 호출 가능 객체는 문자열 생성자에서 호출되어야합니다. 현재 동작은 목록의 마지막 호출 가능 항목이 목록에 호출 가능 횟수만큼 호출된다는 것입니다. 현재 코드 :호출 가능 목록을 반복하는 문제

for m in list_of_callables: 
    strings = (m(s) for s in strings) 

위의 코드 문자열은 기본적으로 'Generator'유형입니다. 나는 또한 시도 다음

for i in range(len(list_of_callables)): 
    strings = (list__of_callables[i](s) for s in strings) 

이 어느 일을하지 않은,하지만 난 callables을 통해 루프를하지 않고 단순히를 호출 할 때 그것을 잘 작동합니다 :

strings = (list_of_callables[0](s) for s in strings) 
strings = (list_of_callables[1](s) for s in strings) 

이가 이상한 것 같다 나를 위의 for 루프와 동일해야합니다.

도움과 제안에 미리 감사드립니다. :)

+3

을이 [후기 바인딩 폐쇄]의 에피소드 (http://docs.python-guide.org/en/latest/ 같은 소리 writing/gotchas/# late-binding-closures) –

+1

'generator '가 무엇을 의미하는지 알고 계십니까? 제네레이터 표현식 (https://docs.python.org) 대신 [list comprehension] (https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)을 사용하고 싶습니다. /3/reference/expressions.html#generator-expressions). –

+1

여기서 예상되는 동작은 무엇입니까? 발전기의 내부와 외부 모두에있는 식별 자'문자열 '을 다시 사용하여 혼란 스럽습니다. 따라서 코드 뒤에있는 추론을 이해하는 것은 매우 어렵습니다. –

답변

3
strings = (m(s) for s in strings) 

실제로는 호출자를 호출하지 않습니다. m 나중에 호출하는 을 사용하는 생성자 식을 생성합니다. 이 나중에 발생하면이됩니다.

루프가 끝나면 m이 최종 호출 가능합니다. strings에서 요소를 검색하려고하면 중첩 된 모든 genexps가 값을 계산하기 위해 m을 조회하고 모두 마지막 호출 가능 항목을 찾습니다.

당신은 대신 genexp의 itertools.imap를 사용하여이 문제를 해결할 수 :

strings = itertools.imap(m, strings) 
+0

도움 주셔서 대단히 감사합니다. :) –

관련 문제