【Python】文字列へのインデックス(添え字)によるアクセス方法。ほか、イミュータブル特性など【入門第14回】

90, 2019-08-08

目次

文字列へのアクセス

こんにちは、narupoです。

今回も文字列です。

そろそろ、

また文字列かよ!

というツッコミが聞こえてきそうですが、まだまだやります

今回は

  • 添え字で文字列の要素にアクセス

  • 文字列はイミュータブル(不変)

を見ていきます。

添え字で文字列の要素にアクセス

文字列の特定の文字を取得したい場合があります。

たとえば

:::python
msg = '筋肉は優しい'

という文字列があって、先頭の'筋'という文字を取得したい場合は↓のようにします。

:::python
msg[0]

これを出力すると、

:::python
print(msg[0])

↓のような結果が得られます。

文字列に角かっこ([])を付けて数字0をその角かっこの中に入れます。
こうすると、msgの先頭の要素にアクセスできます。

要素とは?

文字列の特定の文字のことを、その文字列の要素といいます
たとえば文字列msgがあって、その文字列からmsg[0]というアクセスで取得できる要素は、
「文字列msgの0番目の要素」と言います

このとき、数字0のことをインデックス(添え字)と言います。

添え字の範囲

msg[0]というアクセスで、文字列の先頭の要素が取得できることに違和感を感じた人がいるかもしれません。

「最初の要素なら、0じゃなくて1番目じゃないの?」

はい。実は、添え字によるアクセスでは、数は1番目からではなくて0番目から数えます。
(これを0オリジンともいいます。ただ、海外では0ベースというのが一般的らしいです)

なので、

:::python
msg = '筋肉は美しい'

という文字列があった場合、'筋'の字へのアクセスではmsg[0]とします。
その次の'肉'の字へのアクセスではmsg[1]とするわけです。

ややこしい

この0オリジンという概念は、他のプログラミング言語でも取り入れている言語が多いです。
なので、プログラミングをするなら避けては通れません
慣れましょう

末尾の要素へアクセス

前回は、文字列とlen関数をやりました。
このlen関数を使えば文字列の末尾の要素に簡単にアクセスできます。

len関数は文字列の長さを返します。
そして添え字によるアクセスは0オリジンです。
つまり、文字列の長さ - 1が末尾の要素への添え字になります。

なので以下のようにすると文字列の末尾の要素にアクセスできます。

:::python
msg[len(msg)-1]

これはこれで正解なのですが、Pythonではもっと簡単に末尾の要素にアクセスできます。
添え字に-1を指定すると末尾の要素へのアクセスになります。

:::python
msg[-1]

末尾から2つめの要素には-2を指定します。

:::python
msg[-2]

また、len関数を使った場合も-1を指定した場合も、文字列の長さが足りなかった場合、Pythonはエラーを返します

:::python
msg = ''
msg[-1]

↑のコードを実行すると↓のようになります。

IndexError: string index out of range

このエラーを日本語にすると「添え字エラー: 文字列の添え字が範囲外です」という意味になります。

指定された添え字の要素は存在しないぞゴルァ!

ということですね。

要素の型は?

添え字によるアクセスで取得できる要素のはなんなのでしょうか?
じつはこれもstr型です。

:::python
msg = '筋肉合理主義'
print(type(msg[0]))

↑のコードを実行すると↓のようになります。

<class 'str'>

取得する要素はひとつだけなので、この要素の文字列としての長さは常に1ということになります。

:::python
print(len(msg[0]))
1

要素が文字列で、長さが1なら、添え字0でまたその要素にアクセスできるのでは?
はい、その通りですね。
やってみましょう。

:::python
msg = '夕焼けアワー'
msg[0][0]

↑のコードは問題なく実行できます。
さらにその添え字0の要素はもちろんstr型なので、↓のようなコードも合法です。

:::python
msg = 'クリームソーダ'
msg[0][0][0][0][0][0][0][0][0][0][0][0][0][0]

永遠に添え字0でアクセスできてしまいますね。こういうのを再帰的と言います。

文字列はイミュータブル(不変)

文字列の特定の文字を別の文字で上書きしたい時があります。
たとえば↓の文字列Catの先頭の文字をRに変えて、Ratにしたい時があります。

あるあるあ……ねーよ

:::python
kind = 'Cat'

添え字で要素にアクセスして、その要素を上書きしたくなるのが心情というものですが、

:::python
kind = 'Cat'
kind[0] = 'R'

↑これを実行すると↓のようなエラーになります。

TypeError: 'str' object does not support item assignment

このエラーを日本語にすると「型エラー: 文字列は代入をサポートしていません」という意味になります。
つまり、文字列は要素への代入をサポートしていないんですね。

このようなオブジェクト(数値や文字列などのこと)をイミュータブル(不変)なオブジェクトと言います。
つまり、「俺たちは変更できないぜ」ってことですね。

ですので、先頭の文字を変更したい場合は↓のようにします。

:::python
cat = 'Cat'
rat = 'R' + cat[1:]

こうすると文字列Catの先頭の文字をRに変更することが出来ます。
変数catとは別に、変数ratを新しく作っていますね。
このようにPythonで文字列に加工を加えるさいは、新しく文字列を作っていくのが普通です。
cat[1:]というところはまだやっていませんが、これはスライスといいます)

おわりに

いかがでしたでしょうか。
まとめると↓のようになります。

  • 文字列の特定の文字にアクセスするには「添え字」を使う

  • 文字列は変更できない

文字列のスライス機能については次回見ていきたいと思います。

次回に続きます。

また見てね

関連動画