본문 바로가기
Base/Python

13. 메모리구조 / global 키워드 / 복사

by 귀멸 2023. 2. 27.

혼공파 54 ~ 56 강

 

1. 스택과 힙 / 함수의 할당과 참조

# 자료구조
# 스택과 힙 : 너무너무 유용!

# 메모리 관리에서의 스택과 힙

# 현대적인 프로그래밍 언어
# 자료를 크게 2가지로 구분

# (1) 기본 자료형 : 작고 간단한 것
# 숫자, 문자열, 불 등
# 크기가 작고 고정되어 있으므로 상자에 넣어서 옆에 차곡차곡 보관
# 스택에 넣어서 보관한다

# (2) 복합 자료형 : 크고 무거운 
# 리스트, 딕셔너리, 객체 
# 크기가 정해져 있지 않고,
# 다른 창고에 보관을 하고, 이 위치를 상자에 넣어 차곡차곡 보관
# 힙이라는 창고에 보관하고 스택에 위치를 보관한다

# 할당과 참조
## 할당 : 값을 저장하는 것
a = 10
b = True
c = "안녕하세요"

## 접근/참조 : 저장된 값을 가져가 쓰는 것
print(a)
print(b)
print(c)


### 함수에서의 할당!
a = 10
b = [1, 2, 3, 4]

def function():
  a = 20
  b = [5, 6, 7, 8]
  print(a) # 20
  print(b) # [5, 6, 7, 8]
function()

print(a) # 10
print(b) # [1, 2, 3, 4]

# 함수 호출 할 때 마다 함수 스택이 따로 만들어 진다
# 파이썬에서 변수를 참조할 때는
# 자신과 가까운 스택부터 위로 올라가면서 참조


2. 메모리 구조와 global 키워드

# 전역 위치에서 a, b라는 변수를 생성
a = 10
b = [1, 2, 3, 4]

def function():
  global a, b # 함수 스택이 아닌 글로벌 스택 값을 이용
  a = 20
  b = [5, 6, 7, 8]
  print(a) # 20
  print(b) # [5, 6, 7, 8]
function()

print(a) # 20
print(b) # [5, 6, 7, 8]

# 함수 호출 할 때 마다 함수 스택이 따로 만들어 진다
# 파이썬에서 변수를 참조할 때는
# 자신과 가까운 스택부터 위로 올라가면서 참조

# 전역 위치에서 a, b라는 변수를 생성
a = 10
b = [1, 2, 3, 4]

def function():
  a = 20
  b.extend([5, 6, 7, 8]) 
  # 스택을 변경하지 않기 때문에 global 사용하지 않아도 오류없이
  # 함수 내부의 b가 없으므로 글로벌 스택의 b 값을 이용한다.
  print(a) # 20
  print(b) # [1, 2, 3, 4, 5, 6, 7, 8]
function()

print(a) # 10
print(b) # [1, 2, 3, 4, 5, 6, 7, 8]

3. 함수의 값 복사와 레퍼런스 복사

# 변수를 변수에 할당하면[복사하면]
# 스택에 있는 것이 할당[복사]되는 것이다!
a = 10
b = a
a = 20

print(a) # 20
print(b) # 10

# 주소를 스택에 저장
a = [1, 2, 3, 4]
b = a # 스택에는 리스트의 주소가 저장되어 있다!!
a = [5, 6, 7, 8] # 새로운 리스트를 다른 힙에 저장하고 주소가 바뀜

print(a) # [5, 6, 7, 8]
print(b) # [1, 2, 3, 4]

a = [1, 2, 3, 4]
b = a # 스택에는 리스트의 주소가 저장되어 있다!!
a.append(5) # 기존 스택에 5를 추가한다.

print(a) # [1, 2, 3, 4, 5]
print(b) # [1, 2, 3, 4, 5]

# 매개변수 복사
a = 10
b = [1, 2, 3, 4]

print(a, b) # 10 [1, 2, 3, 4]

def function_a(c, d):
  c = 20
  d = [5, 6, 7, 8]
function_a(a, b)

print(a, b) # 10 [1, 2, 3, 4]

def function_b(c, d):
  c = 30
  d.extend([9, 10])
function_b(a, b)
print(a, b) # 10 [1, 2, 3, 4, 9, 10]

댓글