아래 두 코드 중 하나는 에러가 발생한다. 정답을 보지 말고 생각을 해보자!

1번 코드

x = 1
def f():
    y = x
    return y

print(f())

2번 코드

x = 1
def f():
    y = x
    x = 2
    return y

print(f())

 

정답은 2번 코드가 에러가 발생한다.

거의 동일한 코든데 왜 하나는 에러가 발생하고 하나는 정상 동작할까? 그 이유는 파이썬의 local, global 변수 규칙에서 찾을 수 있다.

 

파이썬에서는 함수 전체를 보고 global 변수인지 local 변수인지 결정을 한다.

함수 전체에서 reference만 일어난다면 이는 암묵적으로 global이라 판단한다. 그러나 assign이 한 번이라도 일어난다면 이는 local 변수로 판단을 한다.

위의 1번 코드에선 할당 없이 reference만 일어났기 때문에 x가 global가 되는 것이다. 하지만 2번 코드에서는 assign이 일어나기 때문에 local 변수가 되지만 y = x 부분에서 아직 선언되지 않은 x를 쓰기 때문에 에러가 발생한다.

이런 문법은 의도하지 않은 전역 변수 사용에 대한 side effect를 막아준다고 한다.

만약 할당을 하고 싶으면 global 키워드를 사용하자!

cf) 개인적으로 이러한 문법이 좋지는 않다고 생각된다...  

 

참고 자료

https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python

 

Programming FAQ — Python 3.10.4 documentation

Use the built-in function isinstance(obj, cls). You can check if an object is an instance of any of a number of classes by providing a tuple instead of a single class, e.g. isinstance(obj, (class1, class2, ...)), and can also check whether an object is one

docs.python.org

 

'Python3' 카테고리의 다른 글

[Python3] GIL (Global Interpreter Lock)  (0) 2022.05.15
복사했습니다!