2016-11-22 1 views
1

이 코드 블록을 실행했는데 결과가 놀랍습니다. 나는 내가 재사용한다는 것을 안다. 나의 질문은 왜 내가 다시 할당 된 이후 첫 번째 반복 이후에 루프가 빠져 나오지 않는가이다.파이썬 블록 스코프 - 누군가가 이것을 설명합니다

코드 :

for i in range(3): 
    print '=====' 
    print 'Outer I: ', i 
    print '=====' 
    for j in range(2): 
     print 'J', j 
     for i in range(5): 
      print 'Inner I', i 
    print '=====' 
    print 'Outer I Again: ', i 
    print '=====' 

출력 :

===== 
Outer I: 0 
===== 
J 0 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
J 1 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
===== 
Outer I Again: 4 
===== 
===== 
Outer I: 1 
===== 
J 0 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
J 1 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
===== 
Outer I Again: 4 
===== 
===== 
Outer I: 2 
===== 
J 0 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
J 1 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
===== 
Outer I Again: 4 
다음

혼란 것들 :

  • 내가 루프가 첫 번째 반복 후 휴식 기대가 있지만, 하지 않습니다.
  • 같은 이유로 첫 번째 인쇄 문 "외부 I" 은 i의 올바른 값을 인쇄합니다.
  • 두 번째 바깥 쪽 인쇄 문 "바깥 쪽 다시"는 잘못된 값을 인쇄합니다.

저는 파이썬 2.7에서 CPython을 사용하고 있습니다.

+0

코드가 잘못되었습니다. 내부 루프에'i' 변수를 재사용하고 있습니다. 범위 내 (i)에 대해 : – EdChum

+0

한 가지만하면 아마 원하는 것을 찾을 수 있습니다. ** inner **를 다른 변수 ** k **로 대체하십시오. 당신은 그것이 마술 같이 작동 할 것이라는 점을 볼 것이다 !! ;) –

+1

Python에는 블록 범위가 없습니다. [범위 지정 규칙에 대한 간단한 설명] (http://stackoverflow.com/questions/291978/short-description-of-scoping-rules) 및 [Python에서 블록 범위] (http://stackoverflow.com/questions/6167923)를 참조하십시오./block-scope-in-python) –

답변

3

이 코드에는 내부 i 또는 외부 i이 없으며 두 개의 서로 다른 루프에 하나의 i 변수가 할당되어 있습니다. 루프가 첫 번째 반복 이후에 중단되어야하는 이유는 무엇입니까? 파이썬의 for은 기본적으로 다른 언어의 for each 루프이며 반복기 또는 생성기의 멤버를 반복합니다. range 함수는 [0,1,2,3,4] 요소의 목록을 반환하고 각 반복 i에는 목록의 다음 값이 주어지며 현재 값 i은 외부 루프와 관련이 없습니다.

첫 번째 Outer I은 예상 한 값인 i을 인쇄하지만 두 번째 (내부 루프 이후) 값은 인쇄하지 않습니다.

0

당신은 당신의 내부 루프의 i 변수를 재사용하고 있습니다 :

for i in range(5) 

그래서 당신은 참조하십시오

Outer I Again: 4 

다른 변수 이름으로 변경하면 예상대로 다음 작동 :

In [12]: 
for i in range(3): 
    print('=====') 
    print('Outer I: ', i) 
    print('=====') 
    for j in range(2): 
     print('J', j) 
     for l in range(5): 
      print('Inner I', l) 
    print('=====') 
    print('Outer I Again: ', i) 
    print('=====') 

===== 
Outer I: 0 
===== 
J 0 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
J 1 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
===== 
Outer I Again: 0 
===== 
===== 
Outer I: 1 
===== 
J 0 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
J 1 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
===== 
Outer I Again: 1 
===== 
===== 
Outer I: 2 
===== 
J 0 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
J 1 
Inner I 0 
Inner I 1 
Inner I 2 
Inner I 3 
Inner I 4 
===== 
Outer I Again: 2 
===== 
0

변수를 다시 사용하고 있지만 대상 변수는 동일하게 유지됩니다. 이 경우 변수의 범위는 내부 변수 i와 함께 변경되지 않습니다. 문자열이나 정수와 같은 변경 불가능한 객체로 작업 할 때는 문제가 발생하지 않습니다. 두 번째 대신 다른 변수를 사용하면 나갈 수 있습니다.

+0

Mutability는 아무 관련이 없습니다. * 예제는 실제로 정수로 작업합니다. –

관련 문제