source

이 Unbound Local Error가 발생하는(닫힘) 이유는 무엇입니까?

bestscript 2022. 12. 24. 20:38

이 Unbound Local Error가 발생하는(닫힘) 이유는 무엇입니까?

내가 여기서 뭘 잘못하고 있는 거지?

counter = 0

def increment():
  counter += 1

increment()

위의 코드는UnboundLocalError.

Python은 변수 선언이 없기 때문에 변수 자체의 범위를 파악해야 합니다.이는 단순한 규칙에 의해 이루어집니다.함수 내의 변수에 대한 할당이 있는 경우 해당 변수는 [1]로컬로 간주됩니다.즉, 선은

counter += 1

암묵적으로 만들다counter의 지역적인.increment()그러나 이 행을 실행하려고 하면 로컬 변수 값을 읽으려고 합니다.counter가 할당되기 전에,[2] 그 결과 가 됩니다.

한다면counter는 글로벌 변수입니다.키워드가 도움이 됩니다.한다면increment()로컬 함수입니다.counter로컬 변수, Python 3.x에서 사용할 수 있습니다.

로컬 변수 대신 글로벌 변수 카운터를 변경하려면 global 문을 사용해야 합니다.

counter = 0

def increment():
  global counter
  counter += 1

increment()

동봉한 범위가 다음과 같은 경우counter는 글로벌 스코프가 아닙니다.Python 3.x 에서는 로컬 이외의 문을 사용할 수 있습니다.Python 2.x에서도 같은 상황에서는 로컬이 아닌 이름으로 재할당할 수 없습니다.counter, 그래서 당신은 그것을 만들 필요가 있습니다.counter변경할 수 있습니다.

counter = [0]

def increment():
  counter[0] += 1

increment()
print counter[0]  # prints '1'

제목 줄의 질문에 답하기 위해, * 네, Python에서는 함수 내부에만 적용되는 것을 제외하고 닫힘이 있습니다.또한 (Python 2.x에서는) 읽기 전용입니다.다른 오브젝트에 이름을 재바인드 할 수 없습니다(오브젝트가 변경 가능한 경우 내용을 변경할 수 있습니다.Python 3.x에서는 키워드를 사용하여 폐쇄 변수를 수정할 수 있습니다.

def incrementer():
    counter = 0
    def increment():
        nonlocal counter
        counter += 1
        return counter
    return increment

increment = incrementer()

increment()   # 1
increment()   # 2

* Python의 폐쇄에 대한 질문입니다.

당신의 코드로 인해UnboundLocalError이미 다른 답변에서도 잘 설명되어 있습니다.

하지만 제가 보기에 당신은 다음과 같은 기능을 하는 것을 만들려고 하는 것 같습니다.

테스트해 보고, 고객의 경우에 적합한지 확인해 주세요.

>>> from itertools import count
>>> counter = count(0)
>>> counter
count(0)
>>> next(counter)
0
>>> counter
count(1)
>>> next(counter)
1
>>> counter
count(2)

Python은 기본적으로 어휘 범위를 가지고 있습니다. 즉, 동봉된 스코프가 동봉된 스코프의 값에 액세스할 수 있지만 (키워드를 사용하여 글로벌하게 선언되지 않는 한) 값을 수정할 수 없습니다.

폐쇄는 주변 환경의 값을 로컬 환경의 이름에 바인딩합니다.그런 다음 로컬 환경은 바인딩된 값을 사용할 수 있으며 해당 이름을 다른 이름으로 재할당할 수도 있지만, 폐쇄 환경에서는 바인딩을 수정할 수 없습니다.

같은 하려고 합니다.counter바인딩된 값이 아닌 로컬 변수로 사용됩니다.이드,음, 음음음음음 of of of 의 값을 묶는 입니다.x인클로저 환경에 할당되어 정상적으로 동작합니다.

>>> x = 1

>>> def f():
>>>  return x

>>> f()
1

함수 내의 글로벌 변수를 변경하려면 global 키워드를 사용해야 합니다.

라인 없이 이걸 하려고 하면

global counter

increment 정의의 내부에는 counter라는 이름의 로컬 변수가 생성되어 프로그램 전체가 의존하는 카운터 변수가 흐트러지지 않도록 합니다.

변수를 변경할 때만 global을 사용할 수 있습니다.global 문을 사용하지 않아도 증분 내에서 카운터를 읽을 수 있습니다.

이것을 시험해 보세요.

counter = 0

def increment():
  global counter
  counter += 1

increment()

Python은 순전히 어휘 범위만 있는 것이 아니다.

자세한 내용은 함수전역 변수 사용을 참조하십시오.

또한 Notes on Python 가변 범위.

언급URL : https://stackoverflow.com/questions/9264763/why-does-this-unboundlocalerror-occur-closure