Python 3 : 범위에서 재정의 할 때 변수가 해결되지 않음

조딘 데프

데코레이터를 작성하고 있는데 어디서든 그것들을 재정의하려고하면 내부 함수에 변수 범위가있는 이상한 동작이 있습니다.

def decorate_me(a_variable: bool):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):

            print(a_variable)
            new_variable = not a_variable
            new_variable = not new_variable
            print(new_variable)

            return func(*args, **kwargs)

        return wrapper
    return decorator

예상대로 작동하며 문제가 없습니다. 그러나 a_variable이 마지막에 재정의되면 :

def decorate_me(self, a_variable: bool):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):

            print(a_variable)
            new_variable = not a_variable
            new_variable = not new_variable
            print(new_variable)
            
            # --- --- --- --- --- ---
            # THIS LINE RIGHT HERE
            # --- --- --- --- --- ---
            a_variable = not a_variable

            return func(*args, **kwargs)

        return wrapper
    return decorator

이로 인해 오류가 발생합니다.

File "...", line 41, in wrapper
    print(a_variable)
UnboundLocalError: local variable 'a_variable' referenced before assignment

변수를 재정의하면 어떻게 재정의보다 몇 줄 위의 명령문에서 바인딩이 해제됩니까? 여기서 규칙은 무엇이며 어떻게 피할 수 있습니까?

조딘 데프

이것은 Python FAQ 에서 대답 하고 Eli Bendersky가 여기에서 설명 합니다 . 'Python UnboundLocalError'를 검색 할 때 가장 먼저 표시되는 것입니다.

Python의 FAQ에서 :

이는 범위의 변수에 할당 할 때 해당 변수가 해당 범위에 대해 로컬이되고 외부 범위에서 비슷한 이름의 변수를 숨기기 때문입니다. foo의 마지막 문은 x에 새 값을 할당하므로 컴파일러는이를 지역 변수로 인식합니다. 결과적으로 이전 print (x)가 초기화되지 않은 지역 변수를 인쇄하려고 시도하고 오류가 발생합니다.

간단히 변수를 재정의하면 범위가 재정의되므로 외부 범위에서 변수가 제거됩니다.

이에 대한 해결책은 global또는 nonlocal키워드 를 사용하는 것 입니다. 문제의 예에서 global작동하지 않음 ( a_variable)은 전역 적이 지 않지만 nonlocal작동합니다. 명시 적으로 내부 함수에 외부 범위의 변수를 사용하도록 지시합니다.

Eli Bendersky의 설명은 왜 이런 일이 발생하는지에 대해 더 자세히 설명하며 읽을 가치가 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

flutter의 범위에서 변수가 변경되지 않음

분류에서Dev

Ansible 역할에 인수를 전달할 때 변수가 정의되지 않음 오류입니다.

분류에서Dev

범위 변수를 사용할 때 Excel vba 변수가 정의되지 않았습니다.

분류에서Dev

뷰를 변경할 때 범위가 유지되지 않음

분류에서Dev

함수에서 수정할 때 주요 변수가 업데이트되지 않음

분류에서Dev

html로 표시 할 때 php 변수가 에코되지 않음

분류에서Dev

Python : 변수가 포함 된 함수를 호출 할 때 변수가 정의되지 않았습니다.

분류에서Dev

AngularJS $ scope 변수에 액세스하려고 할 때 정의되지 않음

분류에서Dev

매개 변수에 액세스하려고 할 때 정의되지 않음

분류에서Dev

공장에서 설정할 때 범위 변수에 false를 설정하면 작동하지 않습니다.

분류에서Dev

익명 함수에서 부모 범위의 변수가 변경되지 않음

분류에서Dev

Ajax로 다시 전달할 때 PHP 변수가 정의되지 않음

분류에서Dev

Ajax로 다시 전달할 때 PHP 변수가 정의되지 않음

분류에서Dev

errorPlacement를 재정의 할 때 jQuery 유효성 검사에 올바른 오류가 표시되지 않음

분류에서Dev

해결 방법 viewchild ElementRef를 사용할 때 각도에서 정의되지 않은 속성 'nativeElement'를 읽을 수 없음

분류에서Dev

다른 Java 활동에 액세스 할 때 정적 문자열 변수가 변경되지 않음

분류에서Dev

래퍼 바이너리에서 스크립트를 호출 할 때 Bash 변수가 설정되지 않음

분류에서Dev

함수에서 파이프 라인을 통해 에코를 리디렉션 할 때 환경 변수가 설정되지 않음

분류에서Dev

Django 뷰를 사용할 때 Python의 범위간에 변수가 공유되는 이유

분류에서Dev

각 요소에서 변수를 정의 할 때 목록에서 Unity3d 범위를 벗어남 오류

분류에서Dev

결과를 반환 할 때 항상 결과가 정의되지 않음 Nodejs

분류에서Dev

"문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패"오류가 한 범위에 대해 표시되고 다른 범위에 대해서는 표시되지 않음

분류에서Dev

Promise의 then () 내부에서 변수를 설정할 때 변수가 업데이트되지 않습니다.

분류에서Dev

jquery에서 값을 선택할 때 Angularjs 범위가 업데이트되지 않음

분류에서Dev

C #에서 const를 사용할 때 "변수가 사용되지 않음"

분류에서Dev

연결로 선언 할 때 정의되지 않은 변수

분류에서Dev

함수를 정의 할 때 포인터 또는 참조 변수에 이름이 지정되지 않음

분류에서Dev

변수에 할당 될 때 정의되지 않은 함수

분류에서Dev

requirejs로 해결할 때 Modernizer가 정의되지 않았습니다.

Related 관련 기사

  1. 1

    flutter의 범위에서 변수가 변경되지 않음

  2. 2

    Ansible 역할에 인수를 전달할 때 변수가 정의되지 않음 오류입니다.

  3. 3

    범위 변수를 사용할 때 Excel vba 변수가 정의되지 않았습니다.

  4. 4

    뷰를 변경할 때 범위가 유지되지 않음

  5. 5

    함수에서 수정할 때 주요 변수가 업데이트되지 않음

  6. 6

    html로 표시 할 때 php 변수가 에코되지 않음

  7. 7

    Python : 변수가 포함 된 함수를 호출 할 때 변수가 정의되지 않았습니다.

  8. 8

    AngularJS $ scope 변수에 액세스하려고 할 때 정의되지 않음

  9. 9

    매개 변수에 액세스하려고 할 때 정의되지 않음

  10. 10

    공장에서 설정할 때 범위 변수에 false를 설정하면 작동하지 않습니다.

  11. 11

    익명 함수에서 부모 범위의 변수가 변경되지 않음

  12. 12

    Ajax로 다시 전달할 때 PHP 변수가 정의되지 않음

  13. 13

    Ajax로 다시 전달할 때 PHP 변수가 정의되지 않음

  14. 14

    errorPlacement를 재정의 할 때 jQuery 유효성 검사에 올바른 오류가 표시되지 않음

  15. 15

    해결 방법 viewchild ElementRef를 사용할 때 각도에서 정의되지 않은 속성 'nativeElement'를 읽을 수 없음

  16. 16

    다른 Java 활동에 액세스 할 때 정적 문자열 변수가 변경되지 않음

  17. 17

    래퍼 바이너리에서 스크립트를 호출 할 때 Bash 변수가 설정되지 않음

  18. 18

    함수에서 파이프 라인을 통해 에코를 리디렉션 할 때 환경 변수가 설정되지 않음

  19. 19

    Django 뷰를 사용할 때 Python의 범위간에 변수가 공유되는 이유

  20. 20

    각 요소에서 변수를 정의 할 때 목록에서 Unity3d 범위를 벗어남 오류

  21. 21

    결과를 반환 할 때 항상 결과가 정의되지 않음 Nodejs

  22. 22

    "문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패"오류가 한 범위에 대해 표시되고 다른 범위에 대해서는 표시되지 않음

  23. 23

    Promise의 then () 내부에서 변수를 설정할 때 변수가 업데이트되지 않습니다.

  24. 24

    jquery에서 값을 선택할 때 Angularjs 범위가 업데이트되지 않음

  25. 25

    C #에서 const를 사용할 때 "변수가 사용되지 않음"

  26. 26

    연결로 선언 할 때 정의되지 않은 변수

  27. 27

    함수를 정의 할 때 포인터 또는 참조 변수에 이름이 지정되지 않음

  28. 28

    변수에 할당 될 때 정의되지 않은 함수

  29. 29

    requirejs로 해결할 때 Modernizer가 정의되지 않았습니다.

뜨겁다태그

보관