복붙노트

[PYTHON] 내 전역 변수에 파이썬으로 할당 할 수없는 이유는 무엇입니까?

PYTHON

내 전역 변수에 파이썬으로 할당 할 수없는 이유는 무엇입니까?

파이썬 범위 지정 규칙을 이해하려고 할 때 심각한 문제가 있습니다.

다음 스크립트를 사용하십시오.

a = 7

def printA():
    print "Value of a is %d" % (a)

def setA(value):
    a = value
    print "Inside setA, a is now %d" %(a)


print "Before setA"
printA()
setA(42)
print "After setA"
printA()

예상치 못한 (나에게) 결과물을 제공합니다.

    Before setA
    Value of a is 7
    Inside setA, a is now 42
    After setA
    Value of a is 7

a의 값을 마지막으로 인쇄하는 것이 42가 아닌 곳에서 이루어지기를 기대합니다. 7. 전역 변수의 범위 지정을위한 파이썬의 범위 규칙에 대해서는 무엇을 놓치고 있습니까?

해결법

  1. ==============================

    1.전역 변수는 특별합니다. 함수에 변수 a = 값을 지정하려고하면 같은 이름의 전역 변수가 있더라도 함수 내에 새 로컬 변수가 만들어집니다. 대신 전역 변수에 액세스하려면 함수 내에 전역 명령문을 추가하십시오.

    전역 변수는 특별합니다. 함수에 변수 a = 값을 지정하려고하면 같은 이름의 전역 변수가 있더라도 함수 내에 새 로컬 변수가 만들어집니다. 대신 전역 변수에 액세스하려면 함수 내에 전역 명령문을 추가하십시오.

    a = 7
    def setA(value):
        global a   # declare a to be a global
        a = value  # this sets the global value of a
    

    파이썬의 네이밍 및 바인딩 규칙에 대한 자세한 설명은 네이밍 및 바인딩을 참조하십시오.

  2. ==============================

    2.이것을 이해하는 속임수는 =를 사용하여 변수에 대입 할 때 변수를 로컬 변수로 선언한다는 것입니다. 따라서 전역 변수 a의 값을 변경하는 대신 setA (value)는 전달 된 값으로 지역 변수 (a)를 실제로 설정합니다.

    이것을 이해하는 속임수는 =를 사용하여 변수에 대입 할 때 변수를 로컬 변수로 선언한다는 것입니다. 따라서 전역 변수 a의 값을 변경하는 대신 setA (value)는 전달 된 값으로 지역 변수 (a)를 실제로 설정합니다.

    이것은 setA (value)의 시작 부분에 a의 값을 다음과 같이 출력하려고하면 더욱 분명해진다.

    def setA(value):
        print "Before assignment, a is %d" % (a)
        a = value
        print "Inside setA, a is now %d" % (a)
    

    이 Python을 실행하려고하면 유용한 오류가 발생합니다.

    Traceback (most recent call last):
      File "scopeTest.py", line 14, in 
        setA(42)
      File "scopeTest.py", line 7, in setA
        print "Before assignment, a is %d" % (a)
    UnboundLocalError: local variable 'a' referenced before assignment
    

    이것은 파이썬이 setA (value) 함수가 a라는 지역 변수를 가지기로 결정했다는 것을 알려주고,이 변수는 함수에서 할당 할 때 변경합니다. 함수에 (printA ()와 같이) 할당하지 않으면 파이썬은 전역 변수 A를 사용합니다.

    변수를 전역 변수로 표시하려면 전역 변수를 사용할 범위에서 Python의 global 키워드를 사용해야합니다. 이 경우 setA (value) 함수 내에 있습니다. 그래서 스크립트는 다음과 같습니다.

    a = 7
    
    def printA():
        print "Value of a is %d" % (a)
    
    def setA(value):
        global a
        a = value
        print "Inside setA, a is now %d" %(a)
    
    
    print "Before setA"
    printA()
    setA(42)
    print "After setA"
    printA()
    

    이 한 줄 추가는 파이썬에게 setA (value) 함수에서 변수 a를 사용할 때 지역 변수가 아닌 전역 변수에 대해 말한 것입니다.

  3. ==============================

    3.파이썬에는 다른 언어로 변수 개념이 없습니다. "어딘가에있는"객체가 있고이 객체에 대한 참조가 있습니다. =는 현재 네임 스페이스의 참조에 이러한 개체를 할당하는 데 사용됩니다.

    파이썬에는 다른 언어로 변수 개념이 없습니다. "어딘가에있는"객체가 있고이 객체에 대한 참조가 있습니다. =는 현재 네임 스페이스의 참조에 이러한 개체를 할당하는 데 사용됩니다.

    값이 참조하는 객체를 참조하는 setA 함수의 네임 스페이스에 이름 a를 만듭니다.

  4. ==============================

    4.함수 내에서 a는 지역 변수로 취급됩니다.

    함수 내에서 a는 지역 변수로 취급됩니다.

    함수 내부

  5. ==============================

    5.함수의 실행은 함수의 지역 변수에 사용되는 새로운 기호 테이블을 도입합니다. 보다 정확하게는 함수의 모든 변수 할당은 로컬 심볼 테이블에 값을 저장합니다. 변수 참조는 먼저 로컬 심볼 테이블을 검색 한 다음, 둘러싸는 함수의 로컬 심볼 테이블에서 찾은 다음 전역 심볼 테이블에서 찾은 다음 마지막으로 내장 된 이름 테이블에서 찾습니다. 따라서 전역 변수는 전역 변수에 이름이 지정되지 않은 한 함수 내에서 직접 값을 할당 할 수는 있지만 참조 할 수는 있습니다.

    함수의 실행은 함수의 지역 변수에 사용되는 새로운 기호 테이블을 도입합니다. 보다 정확하게는 함수의 모든 변수 할당은 로컬 심볼 테이블에 값을 저장합니다. 변수 참조는 먼저 로컬 심볼 테이블을 검색 한 다음, 둘러싸는 함수의 로컬 심볼 테이블에서 찾은 다음 전역 심볼 테이블에서 찾은 다음 마지막으로 내장 된 이름 테이블에서 찾습니다. 따라서 전역 변수는 전역 변수에 이름이 지정되지 않은 한 함수 내에서 직접 값을 할당 할 수는 있지만 참조 할 수는 있습니다.

  6. from https://stackoverflow.com/questions/929777/why-does-assigning-to-my-global-variables-not-work-in-python by cc-by-sa and MIT license