메모리 구조

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/74fd4782-afab-4217-8583-26251f8b603a/Untitled.png

프로그램 실행 시 메모리

Text Area : 컴파일된 코드가 올라가는 영역

String Area : 문자열이 올라가는 영역(Read Only)

파이썬에서의 우선 순위

Local → Global → Builtins

# 전역 변수
g = 10      # 함수 바깥에서 선언되었으므로 전역 변수이다.

# 지역 변수
def func():
    g = 100     # 함수 body 안에서 선언되었으므로 지역 변수
    print('func g = ', g)   # LGB 규칙에 의해, local이 우선이므로 지역변수가 출력된다.

func()  # 함수가 호출되며 지역 변수 stack 메모리 할당 -> 함수 끝나며 지역 변수 stack에서 사라짐
print('g = ', g)    # LGB 규칙에 의해, local이 없으므로 global 변수가 출력된다.

# keyword 'global' : 함수 안에서 전역 변수의 값을 바꿔줄 수 있다
def func_local():
    global g
    g = 100

func_local()
print('global g = ', g)

# 객체를 참조하는 변수
def func_list():
    my_list = [10, 20, 30]
    print(id(my_list))
    return my_list

rst = func_list()
print(id(rst))  # 주소는 함수 안과 같다. 같은 리스트 객체를 참조하기 때문이다.
print(rst)
# 함수가 호출되면
# heap 메모리에 list 객체(클래스)가 생성된다
# my_list라는 함수 지역 변수가 stack 영역에 생성되어 리스트를 참조하게 된다
# 함수 호출이 끝나면 참조 카운트가 1에서 0으로 바뀌면서 리스트 객체도 힙에서 사라진다.
# 하지만 지금은 rst라는 전역 변수가 리스트를 참조하므로 카운트가 0이 아니게 되므로 힙에서 사라지지 않는다.

# Builtin 함수(빌트인 함수)
print(dir(__builtins__))    # 파이썬 내장 빌트인 함수 확인하기

# 빌트인 함수의 LGB 규칙
str = 'abc'     # str이라는 전역 변수 선언
def func_str():
    str = 'cde'
    print(str)

func_str()
print(str)

a = 10
a = str(a)      # 이미 str이라는 변수를 전역 변수로 사용해버렸기 때문에 빌트인 함수를 사용할 수 없다...
print(a, type(a))