Python/Basics

Python 변수 개념(namespace, local, global)

jinmc 2021. 2. 5. 10:44
반응형

일단 아래 코드를 봅시다.

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

def info():
    print("%s is %i years old." % (name, age))
    return

info()

 

보통 python에서 변수는 global, local namespace 두 가지로 나눠질 수 있습니다.

local namespace의 변수는 보통 함수 안에 있는 변수를 말하고,

global namespace의 변수는 함수 밖의 변수를 말합니다.

 

하지만 왜 위 함수에서는 함수 안에서(local namepsace), 함수 밖에서(global namespace) 정의한 변수들을 사용하는 걸까요?

Python에서는 global namepsace의 변수들을 함수 안에서 아무 처리 없이 사용할 수 있습니다.

하지만 이는 굉장히 헷갈리고 위험한 방법이죠.

만약 함수 안에 변수를 다시 지정한다면 어떻게 될까요?

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

def info():
    name = "Jim"
    age = 20
    print("%s is %i years old." % (name, age))
    return

info()
print(name, age)

이렇게 되면 global 변수를 사용하는 것이 아닌, local 변수를 사용하는 게 됩니다.

하지만 만약 global 변수를 사용하고 싶다면 어떻게 하면 될까요?

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

def info():
    global name
    global age
    name = "Jim"
    age = 20
    print("%s is %i years old." % (name, age))
    return

info()
print(name, age)

global을 사용하여 변수를 지정해 주면 됩니다.

 

하지만 global 변수를 읽을 때는 global을 사용하지 않아도 되지만, 

다시 global 변수에 다시 값을 쓸 때에는 global로 선정을 해 주어야 합니다.

 

단, 예외가 있다면, class instance(객체)의 경우에는 global을 지칭하지 않고도

그 안의 변수들을 바꿀 수 있습니다.

class varclass:
    var = 3
from lib import varclass
  
varclass = varclass()

def f():
    varclass.var = -1

def f2():
    print(varclass.var)

f()
f2() # -1 이 출력됨!

 

local namespace에서 global 변수를 쓰는 것은 안좋은 practice처럼 보일 수 있습니다.

분명 가독성 측면에서, 그럴 수 있다고 생각은 들지만, 가끔은 모든 함수에서 쓰이는 경우에는 variable을 끊임없이 넘겨주는 것보다

global variable을 constant처럼 쓰는 것은 좋은 사용법이라고 생각합니다.

 

 

반응형

'Python > Basics' 카테고리의 다른 글

Python3 에서 Dictionary 새로운 값 입력하기 및 수정  (0) 2021.12.17
py 파일 pyc로 컴파일 하기  (0) 2021.03.30