본문 바로가기
Computer Science

#2 python의 메모리 할당과 관리 (Everything is object in Python)

by 데이터현 2021. 12. 29.

2021.12.29 - [Comuter Science] - #1 python 메모리 구조

 

#1 python 메모리 구조

최근 기술면접에서 메모리 영역에 대한 질문을 받았는데, 예전 학부 수업때 잘 공부했고 당연히 알고 있다고 생각했는데 당황 + 갑자기 머리 하얘짐 으로 대답을 제대로 못했다. 충격을 받고 다

hkim-data.tistory.com

이전 포스팅에 이어서 실제로 python에서 어떻게 메모리가 할당되고 해제되는지 알아보고자 한다.

 

Everything is object in Python

C에서는 x = 10을 실행하게 되면 x에 주소 값이 할당되고, 그 메모리에 10이라는 값이 들어간다.

그러나 python에서는 x = 10을 실행하게 되면

1. 10이라는 integer 객체가 메모리에 생성된다.

2. 10의 객체가 변수 x 에 의해 참조된다.

x가 10이라는 integer 객체의 주소를 참조하고 있다.

이번엔 y = x 명령어를 실행해 보자.

y라는 또 다른 참조 변수를 생성하고, y는 x가 참조하고 있는 10이라는 integer 객체를 동일하게 참조하게 된다.

둘의 id 값은 동일하다.

정말 동일할까?

sysgetrefcount 메소드를 활용하면 참조하는 객체 수를 알 수 있다.

첫 getrefcount(10)의 출력값이 18인 이유는 파이썬 내부적으로 10이라는 정수형 객체를 이미 사용했기 때문이다. 어쨌든 x와 y를 10이라는 integer 객체를 참조하게 하자 18 -> 20 으로 증가함을 볼 수 있다.

 

다음은 x = x + 1 일때의 경우다. 

이 경우에는 11이라는 새로운 integer 객체가 생성되고 x는 이 객체의 주소 값을 참조하게 된다.

(실제로는 파이썬 내부적으로 이미 11이라는 객체를 사용 중 이지만 이해를 돕기 위해 생성된다고 표현) 

마찬가지로 확인

z = 10 을 실행하게 되면

z라는 변수를 만들고 기존의 10의 객체를 참조하게 된다.

왜냐하면 python은 동일한 값을 가진 객체가 이미 존재하는 경우 새로운 변수에 동일한 객체 참조를 할당함으로써 메모리 사용을 최적화한다.

 

z = Car( )를 실행하게 되면 기존의 10 객체를 참조하지 않고 Car 클래스를 참조하게 된다.

이는 python이 dynamically typed language이기 때문에 가능하다.

 

다음 포스팅에선 실제로 stack과 heap 메모리에서 어떻게 동작하는지 알아보자.

https://hkim-data.tistory.com/182

 

#3 python의 메모리 할당과 관리 (Stack & Heap Memory)

https://hkim-data.tistory.com/181 #2 python의 메모리 할당과 관리 (Everything is object in Python) 2021.12.29 - [Comuter Science] - #1 python 메모리 구조 #1 python 메모리 구조 최근 기술면접에서 메모..

hkim-data.tistory.com

 

 

 

참조

- https://www.youtube.com/watch?v=arxWaw-E8QQ 

댓글