[Python Advanced] Object(객체) 저장 구조에 대한 탐구

2023. 11. 5. 03:34·Programming Language(Sub)/Python

Object(객체) 저장 구조


심화) 파이썬의 Objects 저장 구조

  • C를 공부해보신 분들이라면 Python의 변수가 낯설게 느껴질 수 있다
    • 파이썬에는 포인터의 개념이 따로 존재하지 않음
    • Python과 달리 C에선 대입 연산 시 값을 복사하는게 기본
  • C의 객체가 메모리에 저장되는 구조와 Python의 객체가 메모리에 저장되는 구조의 차이점이 궁금한 분이라면 아래 내용을 읽어보시길 추천합니다.

Python에서 mutable vs immutable

  • 많은 분들이 immutable object 하면 tuple, str 만 생각할 것 같습니다.
  • (혹은 complex, frozenset 까지)
  • 하지만 int, float, bool 도 immutable한 Object 입니다.
    • Why? a = 1하고 a = 2로 수정할 수 있는데?
    • 위에 2개의 명령을 실행한 후 각각 id(a)를 실행해보면 다른 주소를 가지는 것을 볼 수 있습니다.
    • 이유는 "아래 Python에서 변수 이름의 역할"을 보시면 이해가 될 것 입니다.
  • list와 같이 mutable한 객체의 경우 값을 변화시켜도 주소가 같습니다.

Python에서 변수 이름의 역할

  • 예를 들어서 a = 1 을 통해 변수를 생성하는 과정을 살펴보자
    1. PyObject(구조체)를 생성함
      • PyObject는 공통적으로 Typecode, Value, Reference count을 가지고 있음
    2. PyObject의 typecode를 정수형으로 설정
    3. PyObject에 1 저장
    4. a라는 이름을 만들고 PyObject를 가리키게 함
    5. PyObject의 Reference count를 1 증가시킴 (여기선 Reference count 가 1이 된다.
  • b = a
    • b라는 name을 만들고 a가 가리키는 PyObject를 가리킴
    • PyObject의 Reference count를 1 증가시킨다.

여기서 핵심은 메모리 상에 변수의 값과 이름이 분리되어 있다는 것이다.

Python에서 변수의 값을 변경시킬 때

  • a = 1 인 상황에서 a = 2를 실행한다고 해보자
    1. 새로운 PyObject(구조체)를 생성함
    2. 새로운 PyObject의 typecode를 정수형으로 설정
    3. 새로운 PyObject에 2 저장
    4. a가 1을 담고 있던 PyObject를 가리키지 않고 2를 담는 새로운 PyObject를 가리키게 됨
    5. 새로운 PyObject의 Reference count를 1 증가시킴
    6. Garbage Collector가 사용하지 않는 PyObject 메모리 해제

변수를 할당하는 개념이 아니라, 변수의 name을 binding 시킨다고 이해하면 됩니다.

이러한 구조를 사용했을 때 장점

  • 결론 : 불필요한 메모리 사용을 줄일 수 있음
  • 이를 이해하기 위해 아래 경우를 살펴보자
    • 다음 내용을 담고 있는 .Py 파일 실행 결과
    • # case1.py a = 1000 b = 1000 print(a is b) Execution result : True # case1_2.py c = 5 d = 5 print(c is d) Execution result : True
    • 파이썬 Interpreter를 통해 위와 똑같은 내용 실행 결과
    • >>> a = 1000 >>> b = 1000 >>> print(a is b) False >>> c = 100 >>> d = 100 >>> print(c is d) True
  • 실행 결과 해석
    • .py 파일 실행 시 이름이 다른 두 변수의 값이 같으면 같은 곳을 가리킨다
    • Interpreter를 통해 실행하면 결과가 Random인가?
      • value가 between -5 and 256 인 경우 이름이 다른 두 변수의 값이 같으면 같은 곳을 가리킨다 (.py 실행시 값의 범위와 상관 없이 같은 곳을 가리킴)
      • 그 외의 경우 두 변수는 서로 다른 곳을 가리킨다.
  • 이런 구조를 통해 가질 수 있는 장점
    • 같은 값을 갖는 여려 변수가 같은 곳을 가리키고 있을 수 있으므로 메모리 관리 유리
      • 하나의 변수의 값을 변경하고자 할 때 새로운 PyObject를 생성해 가리키므로 다른 변수에 영향을 끼치지 않음

참조) [Python] mutable 과 immutable (Python의 포인터, 변수에 관한 이야기) — 우석블로그, Pointers in Python: What's the Point? – Real Python

'Programming Language(Sub) > Python' 카테고리의 다른 글

[Python] 11. while 문(while statements)  (0) 2023.11.05
[Python] 10. if 문(if statements)  (0) 2023.11.05
[Python] 09. 변수(Variable)  (0) 2023.11.05
[Python] 08. 불(bool) 자료형  (0) 2023.11.05
[Python] 07. 딕셔너리(Dictionary) 자료형  (0) 2023.11.05
'Programming Language(Sub)/Python' 카테고리의 다른 글
  • [Python] 11. while 문(while statements)
  • [Python] 10. if 문(if statements)
  • [Python] 09. 변수(Variable)
  • [Python] 08. 불(bool) 자료형
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (457)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Python Advanced] Object(객체) 저장 구조에 대한 탐구
상단으로

티스토리툴바