python入門講座 | tuple型の使い方2(タプル型の更新方法)[第36回]

アラサーOLのためのpython入門講座
Tuple型はimmutableのため、そのままでは要素の変更ができません。List型を経由します。

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日はtuple型(=タプル型)変数の更新方法を解説します。Tuple型変数は、一度作成すると要素を変更することができません。変更するにはlist型を経由して再定義します。

この記事を読めば、tuple型変数の更新方法を知ることができます。ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Background | tuple型の概要

tuple型(タプル型)はlist型と同様、一つの変数に複数の値を格納することができる変数の型です。日本語では「タプル型」と呼ばれますが、本稿ではtuple型と呼びます。tuple型は、複数の値を格納することができる配列タイプの変数の中では、格納できる値の数やtypeが自由に設定できる柔軟な変数です。配列タイプの変数の種類と特徴についてはこちらの記事を参照ください→「python入門講座 | 配列タイプ変数の種類と特徴(リスト, NumPy配列, DataFrameなど)」。

tuple型には、

  1. どんな型の値や変数でも格納できる (list型と同じ)
  2. 格納された要素を変更できない (list型と異なる)

という特徴があります。1つ目の特徴はlist型と同じです(過去記事「python入門講座 | List型の使い方1(リストを作成する方法)」参照)。2つ目の特徴はtuple型がimmutableという種類の変数であることに起因します。詳しくは前回の記事「python入門講座 | tuple型の使い方1(タプル型の特徴とlist型との違い)」をご参照ください。

今回はtuple型変数の要素を更新する方法を解説します。tuple型変数についての以下の過去記事もご覧ください!

  1. tuple型変数の特徴: python入門講座 | tuple型の使い方1(タプル型の特徴とlist型との違い)



Method | tuple型変数の更新方法

Tuple型変数を更新する方法を解説します。実際に手を動かしながら学んでいきましょう!Jupyter Notebookを立ち上げてコーディングしながら読み進めてください。練習問題の後にコーディング例も掲載しますので、やってみてどうしてもわからなければそれを見て進めてください。



準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_tuple_update」という名前のpython notebookを作成してください。ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これを見ながらやってみてください。

python notebookを起動したら、適宜Markdownセルに説明書きを加えながら下記の説明に沿ってコードを書いて実行していきましょう。Markdownセルやコードセルなどの用語やこれらの使い方についても、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。練習問題の後にpython notebookの例を掲載します。もし書き方がわからなければそちらを見てください。



前提: Tuple型の要素の更新はできない

前提として、tuple型変数はimmutableであるため要素の更新ができません。詳細は前回記事「python入門講座」を御覧ください。ここでは例だけ見ておきましょう。以下を実行してみましょう。

# define a tuple
var_tuple = (1, 3.14, 'a')

# print the variable
print(var_tuple)

# try to change an element
var_tuple[0] = 2 # error

これを実行すると、

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/cc/zd_rdmgn14z8hw956cpfjt480000gn/T/ipykernel_14835/323791425.py in <module>
      6 
      7 # try to change an element
----> 8 var_tuple[0] = 2 # error

TypeError: 'tuple' object does not support item assignment

と「tuple型では要素の更新はできない」というエラーになります。



Tuple型(immutable)の変更には変数再定義が必要

Tuple型のようにimmutableな変数に変更を加えるには、変数自体の再定義が必要です。前述の例のように、0番目の要素を変更したい場合でも以下のように変数全体を定義しなおす必要があります。以下を実行してみましょう。

# update the whole variable
var_tuple = (2, var_tuple[1], var_tuple[2])

# print the variable
print(var_tuple)

こちらはエラーなく実行できます。

しかし、変数の要素を一つ変更するためだけに、いちいち要素を書き下すのは面倒です。また、この例のような要素を書き下して変数を再定義する方法は、コーディング時に要素数が定まっていないような場合(プログラム実行時の結果次第で要素の数が変わる場合)には適用できません。以下でこの問題の解決策を見ていきます。



Tuple型変数の更新方法: Listを経由して要素を更新する

一度list型を経由することで、要素を書き下すことなくtuple型を変更することができます。以下を実行してみましょう。

# define a tuple
var_tuple = (1, 3.14, 'a')

# print the variable
print('before:', var_tuple)

# define a list from tuple
var_list = list(var_tuple)

# change an element
var_list[0] = 2

# convert the list to tule
var_tuple = tuple(var_list)

# print the variable
print('after:', var_tuple)

この例ではtuple型変数var_tupleを”var_list = list(var_tuple)”でlist型に変換し、変数var_listに格納します。List型変数はmutableなので要素の変更ができます。”var_list[0] = 2″で0番目の要素だけ変更します。最後に”var_tuple = tuple(var_list)”でtuple型に変換、変数var_tupleとして再定義しています。

上の例の実行結果は以下となります。

before: (1, 3.14, 'a')
after: (2, 3.14, 'a')

これでtuple型変数var_listの0番目の要素だけ変更できました。



更新前後のメモリアドレス

List型を経由することでtuple型変数の要素が更新できました。要素が更新されていますが、実は変数自体の再定義が行われています。プログラムの中では更新前後の変数どちらもvar_tupleとして呼び出すことができるので実用上は問題ありません。ここでは、メモリアドレスを確認することで変数全体が再定義されていることを確認しましょう。メモリアドレスについては過去記事「python入門講座 | 変数を使いこなそう2(変数の更新方法 — increment/decrementなど)」で触れていますので、そちらも御覧ください。

以下の例を実行してみましょう。

# define a tuple
var_tuple = (1, 3.14, 'a')

# print the variable
print('before (tuple): id =', id(var_tuple), '; value =', var_tuple)

# define a list from tuple
var_list = list(var_tuple)
print('before (list): id =', id(var_list), '; value =', var_list)

# change an element
var_list[0] = 2
print('after (list): id =', id(var_list), '; value =', var_list)

# convert the list to tule
var_tuple = tuple(var_list)

# print the variable
print('after (tuple): id =', id(var_tuple), '; value =', var_tuple)

この例ではtuple型変数var_tupleおよびlist型変数var_listの変更前後のメモリアドレスを確認しています。”id(var_tuple)”と”id(var_list)”のところです。実行結果は以下となります。

before (tuple): id = 140511916955328 ; value = (1, 3.14, 'a')
before (list): id = 140511916957248 ; value = [1, 3.14, 'a']
after (list): id = 140511916957248 ; value = [2, 3.14, 'a']
after (tuple): id = 140511916936640 ; value = (2, 3.14, 'a')

メモリアドレスの値自体は実行するたびに変化しますので、変数を変更する前後のメモリアドレスの変化だけに着目してください。Tuple型変数var_tupleについてはメモリアドレスが変化していることがわかります。すなわち変数自体が再定義されているということです。一方、list型変数は要素の変更前後でメモリアドレスは変化していません。



Result | 練習問題

練習問題をやってみましょう。以下の処理を行うコードを書いてみましょう。

  1. tuple型変数var_tupleを以下の値で作成し、print文で変数のメモリアドレスと内容を出力してください。
    • 値1: ‘dog’
    • 値2: ‘cat’
    • 値3: ‘mouse’
  2. tuple型変数var_tupleの要素’mouse’を’tiger’に変更し(list型を経由して)、print文で変数のメモリアドレスと内容を出力してください。



練習問題の回答例

練習問題の回答が完成したら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!参考にしてみてください。また、今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございます!
今回はtuple型変数の更新方法を解説しました。List型とtuple型、mutableとimmutableなど、入門講座にしてはかなり詳しい内容でしたが、今回の内容を知っておくとプログラミングの知識が深まります。そのような知識はコードの読み書きなど、実戦の場面で役立ちます!

以上「python入門講座 | tuple型の使い方2(タプル型の更新方法)」でした!
またお会いしましょう!Ciao!



References | 参考

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

Pythonの参考教科書

コメント

タイトルとURLをコピーしました