[python] 파이썬 ‘for’루프에서 범위 지정

파이썬의 범위 지정 규칙에 대해서는 묻지 않습니다. 파이썬 for 루프에서 범위 지정이 어떻게 작동 하는지 일반적으로 이해 합니다 . 내 질문은 디자인 결정이 이런 식으로 내려 졌는가입니다. 예를 들어 (말장난 의도가 없음) :

for foo in xrange(10):
    bar = 2
print(foo, bar)

위는 (9,2)를 인쇄합니다.

‘foo’는 실제로 루프를 제어하고 ‘bar’는 루프 내부에 정의되었습니다. 루프 외부에서 ‘bar’에 액세스 해야하는 이유를 이해할 수 있습니다 (그렇지 않으면 for 루프의 기능이 매우 제한적 임). 내가 이해하지 못하는 것은 루프가 끝난 후에 제어 변수가 범위 내에 있어야하는 이유입니다. 내 경험상 단순히 전역 네임 스페이스를 어지럽히고 다른 언어의 통역사가 잡을 수있는 오류를 추적하기가 더 어려워집니다.



답변

가장 쉬운 대답은 문법을 단순하게 유지하고 채택하기에 걸림돌이되지 않았으며 많은 사람들이 루프 구조 내에서 할당 할 때 이름이 속하는 범위를 명확하게하지 않아도되는 것에 만족했다는 것입니다. 변수는 범위 내에서 선언되지 않으며 할당 문의 위치에 의해 암시됩니다. global키워드는 바로 이러한 이유 때문에 (즉, 할당을 의미하는 세계적인 범위에서 수행됩니다) 존재합니다.

최신 정보

여기 주제에 대한 좋은 토론이 있습니다 : http://mail.python.org/pipermail/python-ideas/2008-October/002109.html

루프에 대해 for-loop 변수를 로컬로 만들기위한 이전의 제안은 루프를 종료 한 후 값을 유지하는 루프 변수에 의존하는 기존 코드의 문제를 우연히 발견했으며 이는 바람직한 기능으로 간주됩니다.

요컨대, 파이썬 커뮤니티에서 비난 할 수 있습니다.


답변

파이썬에는 다른 언어 (예 : C / C ++ 또는 Java)와 마찬가지로 블록이 없습니다. 따라서 파이썬에서 범위를 정하는 것은 함수입니다.


답변

이것에 대한 정말 유용한 경우는 enumerate 는 결국 총 수를 원합니다.

for count, x in enumerate(someiterator, start=1):
    dosomething(count, x)
print "I did something {0} times".format(count)

이것이 필요합니까? 아니요. 그러나 편리합니다.

알아야 할 또 다른 사항 : Python 2에서는 목록 이해의 변수도 유출됩니다.

>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9

그러나 Python 3에는 동일하게 적용되지 않습니다.


답변

루프에 break 문이 있고 나중에 반복 값을 사용하여 백업하거나 무언가를 색인화하거나 상태를 지정하려는 경우 한 줄의 코드와 하나의 할당이 저장되므로 편리합니다.


답변

Python의 주요 영향 중 하나는 ABC 에서 초보자에게 프로그래밍 개념을 가르치기 위해 네덜란드에서 개발 한 언어입니다. 파이썬의 제작자 인 Guido van Rossum은 1980 년대에 ABC에서 일했습니다. 나는 ABC에 대해 거의 아무것도 알지 못하지만 초보자를위한 것이므로 초기 BASIC과 같이 제한된 수의 범위를 가져야한다고 생각합니다.


답변

우선 변수가 루프에 대해 로컬 인 경우 해당 루프는 대부분의 실제 프로그래밍에 쓸모가 없습니다.

현재 상황에서 :

# Sum the values 0..9
total = 0
for foo in xrange(10):
    total = total + foo
print total

수율 45. 이제 파이썬에서 할당이 어떻게 작동하는지 고려하십시오. 루프 변수가 엄격하게 로컬 인 경우 :

# Sum the values 0..9?
total = 0
for foo in xrange(10):
    # Create a new integer object with value "total + foo" and bind it to a new
    # loop-local variable named "total".
    total = total + foo
print total

할당 후 루프 내부는 루프 외부 와 동일한 변수가 아니기 0때문에 yields 입니다. 이것은 최적이거나 예상되는 동작이 아닙니다.totaltotal


답변