Python은 다양한 데이터 타입과 변수의 스코프(scope)를 지원하여 개발자에게 유연성을 제공합니다.
그러나 이러한 유연성은 종종 변수의 범위(scope)와 데이터 타입의 가변성(mutable) 여부에 따라 동작이 달라질 수 있다는 것을 의미합니다.
이 글에서는 Python에서 변수의 스코프와 가변 및 불변 데이터 타입의 차이를 설명하겠습니다.
변수의 스코프 (Scope of Variables):
Python에서 변수의 스코프는 변수가 유효한 범위를 나타냅니다.
주요한 변수 스코프는 다음과 같이 세 가지가 있습니다.
지역 변수 (Local Variables):
함수 내에서 정의된 변수로, 해당 함수 내에서만 접근 가능합니다.
전역 변수 (Global Variables):
함수 외부에서 정의된 변수로, 프로그램 전체에서 접근 가능합니다.
비지역 변수 (Non-local Variables):
중첩 함수에서 사용되며, enclosing 함수의 변수를 가리킬 수 있습니다.
이게 무슨 말이냐면 def 바깥의 변수는 전역,
def 안의 변수는 지역,
그리고 그 def 안에 내부 def 가 또 정의되어있다고 하면 외부 def 로컬 변수는 내부 def 입장에서는 비지역 변수이다.
가변(Mutable) vs. 불변(Immutable) 데이터 타입:
Python에서 데이터 타입은 가변(Mutable) 또는 불변(Immutable)일 수 있습니다.
가변 데이터 타입(Mutable):
리스트(List), 딕셔너리(Dictionary), 집합(Set) 등이 가변 데이터 타입에 속합니다. 가변 데이터 타입은 값이 변경 가능하며, 같은 객체를 여러 변수가 참조할 수 있습니다.
불변 데이터 타입(Immutable):
정수(Integer), 문자열(String), 튜플(Tuple) 등이 불변 데이터 타입에 속합니다. 불변 데이터 타입은 값이 변경 불가능하며, 변수에 새로운 값을 할당하면 새로운 객체가 생성됩니다.
어~ 나는 정수던 문자열이던 데이터 값 변경하는데 ? 라고 생각하기 쉽기 때문에,
헷갈릴 수 있지만 이는 새로운 객체로 생성된다
함수에서의 변수 변경:
가변 데이터 타입과 불변 데이터 타입은 함수 내에서의 동작이 다릅니다.
가변 데이터 타입을 함수 내에서 변경하면 원본 객체도 변경되지만,
불변 데이터 타입을 함수 내에서 변경하더라도 원본 객체는 변경되지 않습니다. 예를 들어,
def modify_list(my_list):
my_list.append(4)
def modify_integer(my_integer):
my_integer = 42
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # 출력: [1, 2, 3, 4]
my_integer = 7
modify_integer(my_integer)
print(my_integer) # 출력: 7
결론 및 솔루션:
Python에서 변수의 스코프와 데이터 타입의 가변성 또는 불변성은 프로그램 동작을 이해하는 데 중요한 역할을 합니다.
함수 내에서 변수를 변경할 때 변수가 가변 또는 불변 데이터 타입에 속하는지 이해하고,
스코프에 주의하면 프로그램 오류를 방지하고 코드를 더 명확하게 작성할 수 있습니다.
특히, 많이 쓰는 list 등의 mutable 을 재귀 함수나 중첩된 함수 등에 넘겨 줘서 처리한 후 다시 사용되는 경우라던지 scope 를 명확히 생각하지 않고 쓴다면 문제가 됩니다.
객체 복사를 위한 copy(), 나 deepcopy() 를 사용해야 합니다.
def recursive_function(my_list):
if not my_list:
return []
# 리스트 복사
new_list = my_list[:] # copy() 와 동일
# 리스트 수정
new_list.append(123)
# 재귀 호출
new_list = recursive_function(new_list)
return new_list
주의할 점은 2차원 배열 이상일 때에는 하위 객체까지 복사해야 하기 때문에 deepcopy() 를 써야 합니다.
Python의 유연성을 활용하여 프로그램을 작성하는 데 도움이 되길 바랍니다.
이 글을 통해 Python의 변수 스코프와 데이터 타입의 차이를 명확하게 이해하고, 프로그래밍 작업을 더욱 효율적으로 수행할 수 있을 것입니다.
'IT > 알고리즘 코딩' 카테고리의 다른 글
[코테] 알고리즘 공부 Cheat sheet - 0 (자료구조) (0) | 2023.04.20 |
---|---|
[코테] 알고리즘 공부 Cheat sheet - III (DP) (0) | 2023.04.17 |
[코테] 알고리즘 공부 Cheat sheet - II (search) (0) | 2023.04.16 |
[코테] 사용언어가 파이썬이라서 알아야 하는 것 (0) | 2023.04.16 |
[코테] 알고리즘 공부 Cheat sheet - I (0) | 2023.04.09 |