본문 바로가기
C.W.K.
Stream
Lesson 01 of 07 · published

리스트 — 순서가 있고 고칠 수 있는 모음

~22 min · list, indexing, slicing, sequence

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

Python에서 가장 자주 만나는 모음

리스트는 값을 순서대로 담고, 만든 뒤에도 원소를 더하거나 빼고 바꿀 수 있어. 대괄호, list(), 컴프리헨션으로 만들며 서로 다른 타입도 함께 담을 수 있지만 한 역할의 데이터는 한 모양으로 맞추는 편이 읽기 좋아.

인덱스와 슬라이스

첫 원소의 인덱스는 0이고 음수 인덱스는 뒤에서 세. items[start:stop:step]은 stop 직전까지 새 리스트를 만들며, 시작·끝·간격을 생략할 수 있어. 슬라이스에 값을 대입하면 길이가 다른 구간으로도 바꿀 수 있어.

가변성에는 소유권이 따라와

b = a는 리스트를 복사하지 않고 같은 객체를 가리키게 해. a.copy()a[:]는 바깥 리스트만 새로 만들고, 안쪽 가변 객체는 여전히 공유해. 중첩된 것까지 분리하려면 copy.deepcopy가 필요하지만, 무조건 깊은 복사를 하기보다 무엇을 함께 써야 하는지 먼저 정해.

주의: 함수 기본값에 빈 리스트를 두면 호출 사이에 내용이 남아. 기본값은 None으로 두고 함수 안에서 새 리스트를 만들어.

Code

리스트를 만드는 세 가지 방법·python
# 1. 리터럴 — 90% 는 이거
fruits = ["apple", "banana", "cherry"]

# 2. 생성자 — 어떤 iterable 도 list 로
letters = list("hello")          # ['h', 'e', 'l', 'l', 'o']
range_list = list(range(5))      # [0, 1, 2, 3, 4]

# 3. 빈 list 부터 시작해서 채우기
result = []
result.append(1)
result.append(2)
print(result)                    # [1, 2]
음수 인덱스로 뒤에서 세기·python
scores = [88, 92, 75, 100, 64]

print(scores[0])    # 88   첫 원소
print(scores[-1])   # 64   마지막
print(scores[-2])   # 100  끝에서 두 번째

# 범위 벗어나면 IndexError — 양/음 양쪽 다
# print(scores[5])   # IndexError
# print(scores[-6])  # IndexError
시작·끝·간격으로 슬라이스하기·python
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(nums[2:5])      # [2, 3, 4]      stop 은 EXCLUSIVE (끝 인덱스는 포함하지 않음)
print(nums[:3])       # [0, 1, 2]      처음부터
print(nums[7:])       # [7, 8, 9]      끝까지
print(nums[::2])      # [0, 2, 4, 6, 8]   두 칸씩
print(nums[::-1])     # [9, 8, ..., 0]  뒤집기
print(nums[-3:])      # [7, 8, 9]      뒤 세 개

# 슬라이싱은 항상 새 list. nums 는 그대로.
print(nums)           # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
슬라이스 대입으로 구간 바꾸기·python
data = [10, 20, 30, 40, 50]

# 3 개를 5 개로 교체
data[1:4] = ["a", "b", "c", "d", "e"]
print(data)           # [10, 'a', 'b', 'c', 'd', 'e', 50]

# 슬라이스 삭제
data[1:4] = []
print(data)           # [10, 'd', 'e', 50]

# 안 지우고 끼워넣기 — 길이 0 인 슬라이스
data[2:2] = ["X", "Y"]
print(data)           # [10, 'd', 'X', 'Y', 'e', 50]
별명·얕은 복사·깊은 복사 비교·python
import copy

original = [[1, 2], [3, 4]]

alias = original                     # 같은 list — 두 이름이 한 객체
shallow = original[:]                # 바깥은 새 거, 안은 공유
deep = copy.deepcopy(original)       # 바깥도 안도 다 새 거

original[0].append(99)

print(alias)    # [[1, 2, 99], [3, 4]]   — original 과 공유
print(shallow)  # [[1, 2, 99], [3, 4]]   — 안의 list 는 공유!
print(deep)     # [[1, 2], [3, 4]]       — 완전 독립
가변 기본값을 피하는 방법·python
# 이렇게 하면 안 돼
def bad(item, history=[]):
    history.append(item)
    return history

print(bad("a"))   # ['a']
print(bad("b"))   # ['a', 'b']    <- history 가 재사용됨
print(bad("c"))   # ['a', 'b', 'c']

# 이렇게
def good(item, history=None):
    if history is None:
        history = []
    history.append(item)
    return history

External links

Exercise

1부터 10까지 담은 리스트를 만들어. 반복문이나 컴프리헨션 없이 슬라이스만 써서 앞의 세 값, 뒤의 세 값, 두 번째 값부터 하나씩 건너뛴 값, 역순을 차례로 출력해. 마지막에는 원본 리스트가 그대로인지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.