programing

Python 'for' 루프에서 범위 지정

kingscode 2023. 1. 22. 22:38
반응형

Python 'for' 루프에서 범위 지정

Python의 범위 지정 규칙을 묻는 것이 아니라 Python에서 루프에 대해 범위 지정이 어떻게 작동하는지 일반적으로 알고 있습니다.저는 왜 이런 식으로 디자인 결정이 내려졌는지에 대해 묻고 싶습니다.예를 들어 (말장난은 의도되지 않습니다)

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

상기의 인쇄(9,2)가 됩니다.

'foo'는 루프를 제어하는 것일 뿐이고, 'bar'는 루프의 내부에 정의되어 있습니다.루프 외부에서 'bar'에 액세스할 수 있어야 하는 이유를 이해할 수 있습니다(그렇지 않으면 루프의 기능은 매우 제한됩니다).내가 이해할 수 없는 것은 루프가 종료된 후에도 제어 변수를 범위 내에 유지해야 하는 이유입니다.제 경험상 글로벌 네임스페이스를 혼란스럽게 하고 다른 언어로 된 통역사가 발견할 수 있는 오류를 추적하기가 더 어렵습니다.

가장 가능성이 높은 답변은 문법을 단순하게 유지하고 채택에 걸림돌이 되지 않으며, 많은 사람들이 루프 구조 내에서 이름에 할당할 때 이름이 속한 범위를 명확히 하지 않아도 되는 것에 만족하고 있다는 것입니다.변수는 범위 내에서 선언되지 않으며 할당 문의 위치에 의해 암시됩니다.이 키워드는 이러한 이유만으로 존재합니다(할당이 글로벌스코프에서 이루어졌음을 나타내기 위해서).

갱신하다

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

루프 변수를 루프의 로컬로 하기 위한 이전 제안은 루프를 종료한 후에도 값을 유지하는 루프 변수에 의존하는 기존 코드의 문제에 부딪혔으며, 이는 바람직한 기능으로 간주되고 있습니다.

한마디로 Python 커뮤니티 탓으로 돌릴 수 있습니다.p

Python에는 다른 언어(C/C++ 또는 Java 등)와 마찬가지로 블록이 없습니다.따라서 Python의 scoping unit은 함수입니다.

이 경우 정말 유용한 사례는 다음과 같습니다.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에는 해당되지 않습니다.

Python의 주요 영향 중 하나는 초보자에게 프로그래밍 개념을 가르치기 위해 네덜란드에서 개발된 언어인 ABC입니다.파이썬의 제작자인 Guido van Rossum은 1980년대에 ABC에서 수년간 일했다.ABC에 대해서는 거의 모릅니다만, 초보자용이기 때문에 초기 BASIC과 같이 스코프가 한정되어 있을 것이라고 생각합니다.

Python에서는 일반적인 블록 스코프 동작을 사용하는 다른 언어보다 더 쉬운 설계 선택입니다.

그러나 가능한 한 빨리 해제해야 하는 대규모 임시 어레이가 있을 수 있기 때문에 일반적인 블록 범위를 놓치는 경우가 많습니다.일시적인 함수/클래스 트릭으로 할 수 있지만 인터프리터 상태를 직접 조작함으로써 실현되는 보다 깔끔한 솔루션이 있습니다.

from scoping import scoping
a = 2 

with scoping():
    assert(2 == a)
    a = 3
    b = 4
    scoping.keep('b')
    assert(3 == a) 

assert(2 == a) 
assert(4 == b)

https://github.com/l74d/scoping

break 스테이트먼트가 루프에 있는 경우(또한 나중에 반복값을 사용하여 예를 들어 무언가를 픽업, 색인화 또는 상태 정보를 제공하려는 경우), 코드 한 줄과 할당 한 줄을 저장할 수 있으므로 편리합니다.

우선, 변수가 루프의 국소적인 경우, 이러한 루프는 대부분의 실제 프로그래밍에 사용할 수 없습니다.

현재 상황:

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

율율45이제 Python에서 할당이 어떻게 작동하는지 생각해 보겠습니다.「 」 「 」 、 「 」 。

# 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, 냐냐total에서는, 「이러한 가 「 변수」와 .total루프 밖에 있습니다.이는 최적의 동작 또는 예상되는 동작이 아닙니다.

언급URL : https://stackoverflow.com/questions/3611760/scoping-in-python-for-loops

반응형