728x90
b = 6


def f1(a):
    print(a)
    print(b)
    b = 9


f1(3)

 

이 문법은 발생시키는데
전역 변수 b가 있고 print(b) 다음에 지역 변수 b에 할당하는 문이 나오므로 전역
변수의 값이 6이 출력될 것이라고 생각 했지만 아니다.

사실은 파이썬이 함수 본체를 컴파일 할때 b가 함수 안에서 할당되므로 b를 지역 변수로 판단한다.
생성된 바이트코드를 보면 이 판단에 의해 지역 환경에서 b를 가져오려 한다는 것을 알수 있다.
나중에 f1(3)을 호출할 때 지역변수 a의 값을 출력하지만 지역 변수 b의 값을 가져오려 할때
b가 바인딩 되어 있지 않다는 것을 발견한다.

이 현상은 버그가 아니고 설계 결정사항이다. 파이썬은 변수가 선언되어 있기를 요구하지 않지만,
함수 본체 안에서 할당된 변수는 지역 변수로 판단한다.
이런 방식은 파이썬과 마찬가지로 변수 선언을 요구하지 않지만, var를 이용해서 지역변수를
선언하지 않은 경우 자동으로 전역 변수를 사용해버리는 자바스크립트의 방식보다 훨씬 좋다.
함수 안에 할당하는 문장이 있지만 인터 프리터가 b를 전역 변수로 다루기 원한다면,
다음과 같이 global 키워드를 이용해서 선언해야 한다.

 

b = 6


def f3(a):
    global b
    print(a)
    print(b)
    b = 9


f3(3)
728x90

'Python > python - pythonic' 카테고리의 다른 글

nonlocal 선언 이 필요한 이유  (0) 2020.11.28
클로저 함수  (0) 2020.11.28
데커레이터 함수 이해하기  (0) 2020.11.27
메서드타입 - class method  (0) 2020.11.27
제너레이터를 이용한 지연 실행  (0) 2020.11.25