728x90
반응형

문뜩 파이썬으로 코딩을 하다 파이썬의 전역변수에 대한 의문이 생겼다.

예를 들어 dfs같은 알고리즘 문제를 풀 때 int나 str 객체는 함수 안에서 전역변수로 지정해야 되는 반면

list나, dict는 전역변수로 지정하지 않아도 된다.

 

이 이유가 궁금해서 어떤 차이가 있는지 찾아봤는데 이유는 2가지

mutable, immutable객체의 차이와, 재할당을 하냐 안 하냐 차이인 것 같다.

mutable은 <list, dict, set>, immutable은 <int, str, tuple> 등등이 있는데 

immutable은 = 연산자를 사용하여 값을 변경하려 할 때마다 새로운 객체를 생성하여 재할당하는 반면

mutable은 indexing, slicing등으로, 재할당하지 않고 값을 변경할 수 있다.

 

예를 들어 아래 코드의 실행 결과를 보면 

immutable = False
mutable = [False]

def test():
    immutable = True
    mutable[0] = True
    
test()
print(f"immutable: {immutable}")
print(f"mutable: {mutable}")

아래와 같다.

mutable 객체의 경우에는 객체를 생성하지 않고 바로 수정이 가능하기에 전역변수로 지정을 하지 않아 

로컬 mutable 변수의 값이 수정된다. 하지만 로컬 immutable 변수는 test함수 안에서 수정하려고 해도,

지역변수로써 immutable라는 이름의 객체를 새로 생성하고 할당한 것이기에 로컬 immutable 변수는

변하지가 않는다. 

이렇기에 immutable 객체는 수정하려면 함수안에서 global을 사용해 전역변수로 지정을 해줘야 한다.

 

하지만 만약 아래와 코드와 같이 mutable 객체를 재할당 해야 되는 경우라면

여기서는 mutable 객체도 전역변수로 지정을 해줘야 한다! 

mutable = [False]
global_mutable = [False]

def test():
    global global_mutable
    mutable = [True]
    global_mutable = [True]
    
test()
print(f"mutable: {mutable}")
print(f"global_mutable: {global_mutable}")

코드 실행 결과

728x90
반응형

+ Recent posts