[Python] 전역 변수와 뮤터블 객체의 이해

·2024년 3월 18일
0

파이썬 탐구

목록 보기
1/1

파이썬으로 알고리즘 문제를 푸는도중 계속 이상한 점을 발견해서 원인을 찾아보다보니
그냥 이렇게 블로그에 정리해보려고합니다!

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)

변수 스코프 -> 변수가 프로그램 내에서 접근 가능한 범위

  • 지역 스코프(Local Scope): 함수나 메서드 내부에서 선언된 변수는 그 함수 내부에서만 접근 가능한 것
  • 전역 스코프(Global Scope): 함수 밖에서 선언된 변수는 프로그램 전체에서 접근이 가능

사실 여기까지는 알고있었을 것입니다!
그럼 왜 배열은 수정이 되었고, white라는 변수는 수정이 안되었을까??


리스트는 뮤터블 객체이고, white와 같은 정수는 이뮤터블 객체였기 때문

뮤터블(Mutable) vs 이뮤터블(Immutable) 객체란?

뮤터블 객체는 생성 후에 내용을 변경할 수 있는 객체

ex) 리스트, 딕셔너리, 집합 등..

이뮤터블 객체는 한 번 생성되면 내용을 변경할 수 없는 객체

정수(int), 소수점(float), 문자열(string), 튜플(tuple) 등..


결론

뮤터블 객체는 메모리에 저장된 위치를 가리키므로, 함수 내부에서도 이 객체들의 내용을 변경할 수 있는데,
반대로 이뮤터블 객체는 값을 직접 저장하는 방식을 택하므로 함수 내에서 이를 변경하려면 전역 변수로 명시를 꼭 해줘야 한다고 합니다 !

profile
기억보단 기록을

0개의 댓글