2012-11-08 3 views
2

파이썬에서 변수의 범위에 대해 혼란스러워합니다.for/if 루프와 파이썬 변수의 범위

a = True 
enumerated_set = enumerate(['tic','tac','toe']) 
for i,j in enumerated_set: 
    if a == True: 
     print j 

내가 얻을 결과입니다 : 지금

tic 
tac 
toe 

,

print a

반환

`True` 
여기에 내가 뭘하려고 오전의 장난감 예입니다

이고 다시 만났습니다

for i,j in enumerated_set: 
    if a == True: 
     print j 

출력이 없습니다.

나는 혼란 스럽다 ... 전세계에서 a = True 이래로 왜 두 번째 루프 동안 인쇄가 실행되지 않았는가?

감사합니다.

편집 :

y = 'I like this weather'.split() 
for item in y: 
    for i,j in enumerated_set: 
     if a == True: 
      print j 

또한, 출력 기능은 없습니다 혼란 스러워요 또 다른 예 ....

+1

당신이 그것을 사용할 때마다'enumerate'에 의해 생성 된 생성기를 다시 만들어야 할 것입니다. –

답변

7

그것은 실제로 부울 문제가 아닙니다. 항상 True입니다.

enumerated_set은 생성기입니다. 일단 당신이 그것을 순환하면, 그것은 소진된다. 새 것을 만들어야합니다.

In [9]: enumerated_set = enumerate(['tic','tac','toe']) 

In [10]: enumerated_set.next() 
Out[10]: (0, 'tic') 

In [11]: enumerated_set.next() 
Out[11]: (1, 'tac') 

In [12]: enumerated_set.next() 
Out[12]: (2, 'toe') 

In [13]: enumerated_set.next() 
--------------------------------------------------------------------------- 
StopIteration        Traceback (most recent call last) 
/usr/local/<ipython-input-13-7b0a413e4250> in <module>() 
----> 1 enumerated_set.next() 

StopIteration: 
+0

오, 이제는 의미가 있습니다. 나는 파이썬 문서를 보냈을 뿐이며 여기에 대한 모든 언급을 찾지 못했다. 고맙습니다! – notrockstar

+1

@notorckstart : 답변을 수락하는 것을 잊지 마세요 ;-) 그는 빨리 대답 한 다음 댓글을 달 수 있습니다! ;-) –

+0

지쳐 야합니다. 그렇지 않으면 반복 할 때 멈추지 않을 것입니다 :-) 문제 없습니다! 나는 당신이 함수 호출처럼 생각하고 있다고 생각한다. 예를 들어리스트를 반복 할 때마다 매번 인덱스를 반복하는 내장 메소드를 호출한다. 이것은 매번 요청할 때만 평가되는 "저장된"루프와 비슷합니다. – jdi

1

이 범위에 의한 것이 아니라, 인해 발생기 아니라리스트를 생성 enumerate의 특성이다. 생성기는 일회용입니다. 즉, 요소를 순서대로 팝핑하고 다시 평가할 수있는 목록을 만들지 않습니다. 이렇게하면 메모리를 절약 할 수 있습니다. 두 번 enumerated_set를 반복하고 싶었

, 당신은이 작업을 수행 할 수 있습니다 그것은 변수와는 아무 상관이

enumerated_set = list(enumerate(['tic','tac','toe']))

1

없습니다. 열거 자 개체를 사용하고 있고 첫 번째 루프에서는 끝까지 이동했습니다. 두 번째 루프에서 다시 만들어야합니다.