3秒でわかる
並びの一部を範囲で指定して切り出す書き方。開始と終了の位置を渡すだけで、ループも添字の管理も書かずに部分列を取り出せます。
もう少し詳しく
どういうものか
スライスは、リストや文字列のような順序を持つデータから、指定した範囲を取り出す記法です。Python では lst[start:stop:step] と書き、start を含み stop を含まない範囲が返ります。
省略もできます。lst[:3] は先頭から 3 個、lst[2:] は 3 番目以降、lst[:] は全体の複製です。負の数を使うと末尾から数えるので、lst[-2:] は末尾 2 個になります。
なぜ必要か
範囲を扱う処理を、ループと添字の管理なしで書けます。添字を自分で回すと、境界を 1 つ間違えて範囲外にする誤りが起きますが、スライスは範囲外を指定しても例外を出さず、あるところまでを返します。
意図も読み取りやすくなります。text[:100] は「先頭 100 文字」とそのまま読め、ループの中身を追う必要がありません。
具体例
nums = [10, 20, 30, 40, 50]
print(nums[1:4]) # [20, 30, 40] 1番目から3番目まで
print(nums[:2]) # [10, 20]
print(nums[-2:]) # [40, 50]
print(nums[::2]) # [10, 30, 50] 1つ飛ばし
print(nums[::-1]) # [50, 40, 30, 20, 10] 逆順
text = "2026-08-14"
print(text[:4]) # 2026
print(text[5:7]) # 08ページ送りにもそのまま使えます。
def page(items, page_no, per_page=20):
start = (page_no - 1) * per_page
return items[start:start + per_page]つまずきやすいところ
終了位置が含まれない点を忘れると、毎回 1 個足りない結果になります。nums[1:4] は 4 番目を含みません。「差が個数になる」と覚えると計算しやすく、1 から 4 なら 3 個です。
複製の深さも誤解されがちです。copy = nums[:] は新しいリストを作りますが、中身が入れ子のリストなら内側は共有されたままです。内側まで独立させるには copy.deepcopy が要ります。
言語による違いも押さえておく必要があります。JavaScript の slice(1, 4) は Python と同じく終端を含みませんが、Go のスライスは元の配列と領域を共有するため、切り出した側を書き換えると元も変わります。同じ名前でも性質が違います。
覚え方
「後ろは含まない」。開始と終了の差がそのまま個数です。