리스트는 값을 순서대로 담고, 만든 뒤에도 원소를 더하거나 빼고 바꿀 수 있어. 대괄호, 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