내 글로벌 변수에 할당이 파이썬에서 작동하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/929777

  •  06-09-2019
  •  | 
  •  

문제

파이썬 범위 규칙을 이해하려고 노력하는 데 끔찍한 어려움이 있습니다.

다음 스크립트로 :

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가 아닌 42로 기대할 것입니다.

도움이 되었습니까?

해결책

글로벌 변수는 특별합니다. 변수에 할당하려고하는 경우 a = value 함수 내부에는 동일한 이름의 전역 변수가 있더라도 함수 내부에 새로운 로컬 변수가 생성됩니다. 대신 글로벌 변수에 액세스하려면 a를 추가하십시오 global 성명 기능 내부 :

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

또한보십시오 이름 지정 및 바인딩 Python의 이름 지정 및 바인딩 규칙에 대한 자세한 설명.

다른 팁

이를 이해하는 요령은 변수에 할당 할 때 =를 사용하여 로컬 변수로 선언한다는 것입니다. 따라서 글로벌 변수 a의 값을 변경하는 대신 Seta (값)는 실제로 통과 된 값으로 로컬 변수 (a라고 함)를 설정합니다.

SETA (값)의 시작 부분에서 A의 값을 인쇄하려고하면 다음과 같이 더 분명해집니다.

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

이 파이썬을 실행하려고하면 유용한 오류가 제공됩니다.

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

이것은 Python이 Seta (값) 함수에 A라는 로컬 변수를 가지고 있다고 결정했음을 알 수 있습니다. 이는 기능에 할당 할 때 변경하는 것입니다. (printa ()와 마찬가지로 함수에서 A에 할당하지 않으면 Python은 글로벌 변수 A를 사용합니다.

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

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()

이 한 줄 첨가는 Python에게 SETA (값) 함수의 변수 A를 사용하면 로컬 변수가 아닌 글로벌 변수에 대해 이야기하고 있다고 말합니다.

파이썬에는 다른 언어와 같은 변수 개념이 없습니다. 당신은 "어딘가에"있는 객체가 있으며이 객체에 대한 참조가 있습니다. =이 객체를 현재의 네임 스페이스.

Seta 함수의 네임 스페이스에서 값이 참조하는 객체를 나타내는 이름 A를 만듭니다.

함수 내부 로컬 변수로 취급되므로 정의해야합니다.

글로벌 a

함수 내부

함수 실행은 함수의 로컬 변수에 사용되는 새 심볼 테이블을 소개합니다. 보다 정확하게는 함수의 모든 변수 할당이 로컬 심볼 테이블의 값을 저장합니다. 변수 참조는 먼저 로컬 심볼 테이블에서 보이고, 포함 함수의 로컬 심볼 테이블에서, 그리고 전역 심볼 테이블에서, 그리고 마지막으로 내장 된 이름 테이블에서 보입니다. 따라서 글로벌 변수는 함수 내에서 값을 직접 할당 할 수 없지만 (글로벌 문서에서 명명되지 않는 한) 참조 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top