함수 내 global 선언이 필요한 객체와 그렇지 않은 객체

2024. 2. 13. 19:43코딩 교훈 기록

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

예를 들어 dfs 같은 알고리즘 문제를 풀 때 int 나 str 객체는 함수 안에서 전역변수로 지정해야 활용할 수 있지만, list나, dict는 전역변수로 지정하지 않고도 사용할 수 있다.

그 이유가 궁금해서 찾아본 결과 2가지 차이가 있음을 알 수 있었다.

  1. mutable, immutable 객체의 차이
  2. 재할당을 하냐 안 하냐 차이

 

mutable은 ( list, dict, set ), immutable은 ( int, str, tuple ) 등이 있는데,

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

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

 

mutable 객체의 경우에는 객체를 생성하지 않고 바로 수정이 가능하기에 전역변수로 지정하지 않아도 함수 내 로컬 mutable 변수의 값 수정이 밖까지 반영된다.

하지만 로컬 immutable 변수는 함수 안에서 수정하려고 해도, 지역변수로써 immutable 라는 이름의 객체를 새로 생성하고 할당한 것이기에 함수 밖 immutable 변수는 변하지 않는다.

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

 

하지만 mutable 객체라도 아예 재할당을 해야 하는 경우라면 mutable 객체도 전역변수 지정을 해줘야 한다!