Python入門講座|シーケンス(sequence)型とミュータブル・イミュータブルのイメージ画像

Pythonのシーケンス(sequence)型とミュータブル・イミュータブル

  • 公開日:2018/09/20
  • 更新日:2018/10/19
  • 投稿者:n bit

Pythonのオブジェクトにはシーケンス(sequence)型やミュータブル・イミュータブルと言った機能別のカテゴリがあります。今回はシーケンス型の基本、演算、メソッド、組み込み関数とあわせてミュータブル・イミュータブルも解説します。

  • Python

この記事は約 分で読めます。(文字)

Pythonのシーケンス(sequence)型

Pythonのオブジェクトのシーケンス(sequence)型について先ずは学習していきましょう。

シーケンス(sequence)とは

シーケンス(sequence)とは、データが順番に並べられた状態で保持されており、その並び順通りにデータの処理が行えるオブジェクトを指します。

並び順通りにデータの処理が行われることがポイントで、ただのデータ集合でランダムに配置されているわけではありません。

シーケンス型のオブジェクト

基本的なシーケンス型に該当するオブジェクトはリスト、タプル、そして、この後学習するrangeの3つです。

  • list:リスト
  • tuple:タプル
  • range:レンジ

リストやタプルについては以前学習していますので何となく感じは掴めると思いますが、オブジェクト内に複数の要素が順番に並んでいてインデックス番号で取り出すことができましたよね。

x = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

print(x[3])

出力結果

4

格納されている各要素にインデックスが付与されていて必ずインデックス番号に紐付いた値が取り出されるようになっていました。このように並び順通りに値を取り出し処理できるオブジェクトがシーケンス型オブジェクトでリストやタプルではその特性をしっかりと伺うことができます。

実は文字列(str)もシーケンス型の1つでテキストシーケンス型と呼ばれ、シーケンスと同じようにして扱うことが出来るのです。

x = 'Python'

print(x[3])

出力結果

h

dictやsetもリストとよく似て複数の要素をオブジェクト内に持っていますがシーケンスのように並び順が固定されていないためシーケンスと同じような処理はできません。

シーケンスオブジェクトに共通する特性

それぞれのシーケンスオブジェクトには共通した特性があるもの。同じような演算やメソッド、組み込み関数を使えるのですが、オブジェクトにはミュータブルとイミュータブルと言う区別があり、それによっても少し変わります。

ミュータブル(mutable)とイミュータブル(immutable)

ミュータブルとイミュータブルについて少しだけ解説しておきます。

リストの様に内部要素の値が書き換え可能なオブジェクトを『ミュータブル(mutable)』、タプルの様に内部要素の値が書き換え不可なオブジェクトが『イミュータブル(immutable)』なオブジェクト。

つまり値が書き換え可能か不可能かの違いだけです。用語のせいで難しく感じますが本質は簡単ですね。

それぞれのオブジェクトとミュータブルとイミュータブルの関係性を表したものが以下の表です。ここではシーケンスに関係性があるものや代表的なオブジェクトをピックアップしました。

オブジェクトミュータブルシーケンス
int××
float××
str×
bool××
list
tuple×
dict×
set×
range×

少しややこしいですが、例えばリストであればミュータブルなシーケンス型オブジェクト。タプルであればイミュータブルなシーケンス型オブジェクトです。

ミュータブルと出てくれば書き換え可能、イミュータブルと出てくれば書き換え不可能とだけ覚えておけばよいでしょう。

シーケンスオブジェクトに共通する演算

シーケンスオブジェクトでは以下の演算が共通して利用できます。

演算結果
x in sx が s 内に含まれていれば True
x notin sx が s 内に含まれていなければ True
x + yx と y の結合
x * nx を n回 足しあわせる
s[i]s の i 番目の要素
s[i:j]s の i から j までをスライス
s[i:j:k]s の i から j まで k 毎にスライス

シーケンスオブジェクトに共通するメソッド

シーケンスオブジェクトでは以下のメソッドが共通して用意されています。下記のメッソドはミュータブル、イミュータブルどちらでも利用出来るものです。

メソッド結果
s.index(x)s の中で x が最初に出現するインデックスを取得
s.count(x)s の中に x が出現する回数を取得

それぞれのメソッドの使い方を先ほどのリストオブジェクトを使って解説しました。

メソッド:s.index(x)

index()メソッドは引数に渡した値が何番目の要素に含まれているかをインデックスで返します。複数該当する値があった場合、返されるインデックスは先頭から見て1番最初に該当した要素のインデックスです。

x = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

y = x.index(5)
print(y)

出力結果

4

引数に渡した値「5」はリスト\(x\)を先頭から見て1番最初に該当するのは5番目の要素です。インデックスは0から数えますので出力結果には「4」が返ってきています。

メソッド:s.count(x)

count()メソッドは引数に渡した値が何回オブジェクト内に出現するかをカウントして返します。

x = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

y = x.count(5)
print(y)

出力結果

2

引数に渡した値「5」はリスト\(x\)内に2回出現していますので出力結果には「2」が返ってきています。

シーケンスオブジェクトに利用出来る組み込み関数

シーケンスオブジェクトに共通して利用出来る組み込み関数の一覧です。

関数結果
len(s)s 内の長さ(要素数)を取得
min(s)s 内の最小の値を持つ要素を取得
max(s)s 内の最大の値を持つ要素を取得

各組み込み関数の利用方法についてはそれぞれのページで詳しく解説していますのでそちらをご覧ください。

今日のdot

ミュータブルかイミュータブルか、そしてシーケンス型かによって利用できる演算やメソッド、組み込み関数などに違いがあります。区別ができなくなった場合は下記の一覧表を目安にしてください。

オブジェクトミュータブルシーケンス
int××
float××
str×
bool××
list
tuple×
dict×
set×
range×