Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonにおけるリスト・シーケンス・スライスの違いを徹底解説

Pythonを学んでいると「リスト」「シーケンス」「スライス」という用語が頻繁に登場します。これらは似た文脈で使われるため混同されがちですが、それぞれ役割と意味が異なります。本記事では、3つの概念の違いをわかりやすく整理して解説します。

リストとシーケンスの関係:包含関係にある

まず押さえておきたいのは、「リストはシーケンスの一種だが、シーケンスのすべてがリストとは限らない」という点です。

シーケンス(sequence)とは、特定のデータ型の名称ではなく、シーケンスプロトコル(シーケンスインターフェース)を満たす型の総称です。具体的には、以下のような性質を持つ型がシーケンスに分類されます。

  • インデックス(例:obj[0])によって要素へアクセスできる
  • len() 関数で要素数を取得できる
  • 順序があり、反復処理(イテレーション)が可能
  • スライス操作を受け入れられる

このプロトコルを満たす代表的な組み込み型には、list(リスト)、tuple(タプル)、str(文字列)、rangebytes などがあります。

標準ライブラリでの定義

collections.abc モジュールには Sequence という抽象基底クラス(ABC)が用意されており、これを継承するか isinstance(obj, Sequence) で判定することで、オブジェクトがシーケンスとして振る舞うかどうかを確認できます。

from collections.abc import Sequence

print(isinstance([1, 2, 3], Sequence))   # True(リストはシーケンス)
print(isinstance((1, 2, 3), Sequence))   # True(タプルもシーケンス)
print(isinstance("abc", Sequence))       # True(文字列もシーケンス)
print(isinstance({1, 2}, Sequence))      # False(セットはシーケンスではない)

つまりシーケンスは機能面での上位集合(スーパーセット)を表す抽象的な概念であり、リストはその具体的な実装の一つにすぎません。

スライス:暗黙的に生成される特殊なオブジェクト

一方、スライス(slice)はデータ構造ではなく、範囲指定のためのオブジェクトです。普段私たちが書く foo[2:5] のような記法は糖衣構文(シンタックスシュガー)であり、実際には内部で slice(2, 5) というスライスオブジェクトが自動的に生成されます。

foo = [10, 20, 30, 40, 50]
print(foo[2:5])        # [30, 40, 50](見た目上は単純な記法)

# 実際には次と同じ動作
s = slice(2, 5)
print(foo[s])          # [30, 40, 50]

print(s.start, s.stop, s.step)  # 2 5 None

生成されたスライスオブジェクトは、コンテナ側の特殊メソッドである __getitem__ などに渡されます。独自のシーケンスクラスを作る際に __getitem__ をオーバーライドすると、引数としてスライスオブジェクトを受け取り、その startstopstep 属性を使って柔軟な挙動を実装できます。

class MyContainer:
    def __getitem__(self, key):
        if isinstance(key, slice):
            return f"スライスを受け取った: {key}"
        return f"インデックスを受け取った: {key}"

c = MyContainer()
print(c[1])       # インデックスを受け取った: 1
print(c[1:4:2])   # スライスを受け取った: slice(1, 4, 2)

まとめ:3つの違い早見表

項目種別説明
リスト(list)具象データ型可変な順序付きコンテナ。シーケンスプロトコルを実装した具体型の一つ
シーケンス(sequence)抽象的な概念/プロトコルインデックスアクセスや長さ取得など、共通のインターフェースを満たす型の総称
スライス(slice)範囲指定オブジェクト[start:stop:step] 記法で暗黙的に生成され、__getitem__ 等に渡される

日常的なPythonプログラミングでは、スライスオブジェクトを意識して直接扱う場面はほとんどありません。ただし、自作のシーケンス型やコンテナクラスを実装する場合には、スライスオブジェクトの扱い方を理解しておくことが重要になります。「リスト ⊂ シーケンス」という階層関係と、スライスが「アクセス方法」を表すオブジェクトであるという点さえ押さえれば、3つの違いは明確に区別できるでしょう。

  1. Wi-Fi 6と5Gの違いとは?特徴・速度・使い分けを徹底解説

    5Gネットワークは、SNSなどでも頻繁に話題になる注目の技術です。同様に、Wi-Fi 6への期待も高まっていますが、これは5Gとはまったく異なる技術です。本記事では、Wi-Fi 6と5Gネットワークの違いをわかりやすく解説します。 Wi-Fi 6とは? Wi-Fi 6は、IEEE 802.11ax規格に基づく新しい認証プログラムです。従来のWi-Fi技術と異なる最大の特徴は、より遠い距離でも高速な接続を実現できる点にあります。複数のデバイスが同時に接続されていても安定したパフォーマンスを発揮し、電源環境に多少の問題があっても性能が低下しにくいという優れた特性を持っています。 Wi-Fi 6は

  2. Windows 10とWindows 11の違いを徹底比較!アップグレードすべきか判断するポイント

    Microsoft(マイクロソフト)は、数々の新機能と改善点を盛り込んだ最新OS「Windows 11」をリリースしました。一方で、これまで数多くのパッチやアップデートが適用されてきたWindows 10は、新しいWindows 11よりも安定したOSと言えます。Microsoftによると、Windows 10のサポートは2025年以降に終了する予定のため、Windows 11へアップグレードするか、Windows 10を使い続けるかを検討する時間は十分にあります。この記事では、Windows 10とWindows 11の性能・機能・改善点を比較し、新しいOSへ移行すべきか、それともWindo