[Python] Syntax | 02. List

2026. 2. 15. 02:20·Language/Python

Python의 리스트(list)는 동적 Arraylist입니다.

Arraylist

Arraylist는 요소의 개수에 따라 자동으로 크기를 확장하거나 축소할 수 있습니다. 예를 들어 요소의 개수가 리스트의 최대 크기보다 많아지면, Python은 해당 리스트의 크기를 두 배로 확장합니다. 반대로 요소의 개수가 최대 크기의 절반보다 적어지면, 리스트의 크기를 반으로 축소합니다.

또한 linked list가 아닌 array를 기반으로 하기 때문에, 모든 요소가 연속된 주소에 위치해 있습니다. 따라서 특정 인덱스의 값에 접근할 때는 빠르지만, 값을 추가하거나 제거할 때는 느려질 수 있습니다.

객체 참조

리스트의 각 자리는 값 자체가 아닌 값을 나타내는 객체의 주소값을 저장합니다. 이 덕분에 리스트는 통일된 하나의 데이터 타입이 아닌 다양한 타입의 값들을 넣을 수 있습니다.

값이 변하지 않는 불변값(Immutable)들도 '그 값을 가지는 객체'로서 저장됩니다. 만약 리스트에서 이 값을 수정한다면, 객체의 값 자체가 바뀌는 것이 아니라 새로운 불변값을 가지는 객체가 생성되어 그 주소를 가리키게 됩니다.

 

예를 들어 a[0]의 값을 12에서 11로 바꿨다면, a[0]은 12를 가지는 객체를 가리키다가 11을 가지는 객체를 가리키게 됩니다.

Shallow copy

객체의 주소를 저장하기 때문에, 리스트를 함수의 인자로 넘겨도 값들은 call-by-reference로 넘어가게 됩니다. 이경우 인자로 받은 리스트를 수정하면, 함수 바깥에서도 수정한 리스트가 그대로 반영됩니다.

def head_plus_one(n):  # 리스트를 call-by-reference로 받음
  n[0] = 1
  return n[0]
  
a = [1, 2, 3, 4]
print(head_plus_one(a))  # 2
print(a)  # [2, 2, 3, 4]

원본 리스트의 값을 수정하지 않고 call-by-value 처럼 사용하려면 연산 전에 리스트를 복사해 두어야 합니다. 객체를 복사하는 데는 두 가시 경우가 있습니다.

  • shallow copy : 이름은 다르지만, 서로 가리키는 값의 주소가 같은 경우.
  • deep copy : 이름도 다르고 서로 가리키는 값까지 복사되어 주소도 다른 경우.

Immutable 값만 있는 경우 요소의 값을 바꾸면 자연스럽게 새 주소로 교체되므로 shallow copy만 해도 충분합니다. 하지만 mutable 값의 경우 shallow copy를 해도 가리키는 객체는 여전히 공유하고 있기 때문에 결국 deep copy를 해야만 합니다.

 

일반적인 방법으로는 deeop copy를 할 수 없습니다. 리스트의 대부분 연산은 shallow copy를 전제로 하고 있기 때문입니다.

import copy

a = [1, 2, 3, 4]

# shallow copy의 예시들
b = a[:]

c = list(a)

d = a.copy()

e = copy.copy(a)

Deep copy는 copy 모듈의 deepcopy() 함수로 수행합니다.

import copy

b = copy.deepcopy(a)

주의: shallow copy도 아닌 것들

단순히 변수 이름을 참조하는 것은 copy도 아니고 같은 이름을 공유하는 것입니다.

a = [1, 2, 3]
b = a
a[0] -= 1

print(a)  # [0, 2, 3]
print(b)  # [0, 2, 3]

x += [1] 같은 형태의 연산자는 기존의 리스트를 그대로 사용합니다. 반면 x = x + [1]와 같은 형태는 연산이 적용된 새로운 리스트를 만들어 교체합니다.

# += 를 사용할 때
a = [1, 2, 3]
print(id(a))  # 같음

a += [4]
print(id(a))  # 같음

# + 를 사용할 때
b = [4, 5, 6]
print(id(b))  # 다름

b = b + [7]
print(id(b))  # 다름
728x90

'Language > Python' 카테고리의 다른 글

[Python] Garbage Collection  (0) 2026.02.15
[Python] 동시성과 GIL(Global Interpreter Lock)  (0) 2026.02.15
[Python] Syntax | 01. yield  (0) 2026.02.15
[Python] Library | 07. boto3  (0) 2025.12.31
[Python] Library | 06. OS  (0) 2025.07.28
'Language/Python' 카테고리의 다른 글
  • [Python] Garbage Collection
  • [Python] 동시성과 GIL(Global Interpreter Lock)
  • [Python] Syntax | 01. yield
  • [Python] Library | 07. boto3
Rayi
Rayi
  • Rayi
    아카이브
    Rayi
  • 전체
    오늘
    어제
    • 분류 전체보기 (289) N
      • CS (40) N
        • CV (2)
        • PS (37) N
      • Reveiw (19)
        • Paper (19)
        • Github (0)
      • ML (13)
        • Pytorch (5)
      • Language (68)
        • Python (17)
        • JavaScript (32)
        • TypeScript (16)
        • C++ (3)
      • IDE (12)
      • Git (13)
      • Frontend (77)
        • React (8)
        • ReactNative (6)
        • SolidJS (20)
        • CSS (12)
      • Backend (44)
        • DB (18)
        • Node.js (11)
      • UI (3)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    mongo
    nodejs
    Express
    PRISMA
    vscode
    Three
    ML
    modal
    frontend
    deploy
    react
    ts
    js
    postgresql
    python
    SOLID
    ReactNative
    CSS
    CV
    DB
    GAN
    backend
    expo
    ps
    Git
    review
    CS
    PyTorch
    figma
    API
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Rayi
[Python] Syntax | 02. List
상단으로

티스토리툴바