파이썬으로 알고리즘 문제를 푸는도중 계속 이상한 점을 발견해서 원인을 찾아보다보니
그냥 이렇게 블로그에 정리해보려고합니다!
arr = [1, 2, 3, 4]
white = blue = 0
def example():
white += 1
arr[2] = 2
example()
print("white", white)
print("arr", arr)
이 코드를 실행하면 다음과 같은 오류가 발생하는데,,
white += 1
^^^^^
UnboundLocalError: local variable 'white' referenced before assignment
처음에는 함수 내에서 외부 변수를 조작하지 못한다고 생각했으나,
배열은 오류없이 잘 수정됨을 확인할 수 있다.
arr = [1, 2, 3, 4]
white = blue = 0
def example():
arr[2] = 2
example()
print("arr", arr)
결과값
arr [1, 2, 2, 4]
그럼 배열만 가능한건가??
이 현상은 파이썬의 변수 스코프와 뮤터블/이뮤터블 객체의 차이 때문에 발생한다고 한다.
알겠습니다. 기존 내용에 변수 스코프와 뮤터블, 이뮤터블 객체에 대한 설명을 추가하여 블로그 글을 더 완성된 형태로 만들겠습니다.
변수 스코프란?(Scope)
변수 스코프 -> 변수가 프로그램 내에서 접근 가능한 범위
사실 여기까지는 알고있었을 것입니다!
그럼 왜 배열은 수정이 되었고, white라는 변수는 수정이 안되었을까??
뮤터블(Mutable) vs 이뮤터블(Immutable) 객체란?
뮤터블 객체는 생성 후에 내용을 변경할 수 있는 객체
ex) 리스트, 딕셔너리, 집합 등..
이뮤터블 객체는 한 번 생성되면 내용을 변경할 수 없는 객체
정수(int), 소수점(float), 문자열(string), 튜플(tuple) 등..
결론
뮤터블 객체는 메모리에 저장된 위치를 가리키므로, 함수 내부에서도 이 객체들의 내용을 변경할 수 있는데,
반대로 이뮤터블 객체는 값을 직접 저장하는 방식을 택하므로 함수 내에서 이를 변경하려면 전역 변수로 명시를 꼭 해줘야 한다고 합니다 !