今見たappendメソッドの引数は1つだけで、渡されたものをリストの末尾に追加する(上では文字列を追加しているが、もちろん、それ以外の値を追加することも可能だ)。複数の要素を一度に追加したいときには、「+」演算子を使ってリストを「結合」できる。例えば、以下は先ほど作成したリストに文字列「'C#'」と整数値「99」を追加するものだ。
cs = 'C#'
number = 99
languages = languages + [cs, number]
print(languages)
このコードを実行した結果を以下に示す。
「+」演算子によるリスト結合は、「リスト+リスト」の形式でなければならない。そのため、上のコードでは追加する2つの値(文字列「'C#'」と整数値「99」)を含んだリスト([cs, number])を作成して、結合していることに注意しよう。これは「+」演算子を使ってリストに要素を1つ追加する場合でも同様だ(例:languages + ['C++'])。「+」演算子でリストに単一要素を追加しようとして、次のようなコードを書くとどうなるかを試してみよう。
languages + 'C++'
上のコードをセルに入力して、実行した結果を以下に示す。
ご覧のように、「TypeError」が発生している。その説明を日本語に直すと、「できるのは、リストへのリストの結合だけです(文字列はダメ)」となる。
ところで、「+」演算子によるリストの結合では、その結果を元のリストに代入していることに気が付いただろうか。
languages = languages + [cs, number]
「リスト1 + リスト2」としてリストを結合すると、2つのリストの要素を含んだ新しいリストが作られる。このコードでは、その結合結果を元の変数に代入しているわけだ。これを実際に調べてみるには、Pythonに組み込みのid関数が使える。
id関数は引数に指定したオブジェクトの「アイデンティティー」(識別値)を戻り値とする。Pythonではオブジェクト(整数値や文字列、リストなど)を定義すると、「それを識別する値」が割り当てられる。これがそのオブジェクトの「アイデンティティー」であり、オブジェクトがメモリ上に存在する間はその値が変化することはない。以下にリストを定義、結合するたびにそのアイデンティティーを確認するコードを示す。
somelist = [0, 1, 2]
print(id(somelist))
somelist = somelist + [3, 4]
print(id(somelist))
somelist += [5, 6]
print(id(somelist))
最後の例では、「+」演算子ではなく、「+=」演算子を使って同じ操作を行っている。実行結果を以下に示す。
まず、定義した直後のアイデンティティーは「140318233038408」となっている。一方、結合した後のアイデンティティーは「140318232637320」だ(読者が上のコードを試すと、アイデンティティーは上の画像とは異なるものになるだろう。ただし、前者と後者が異なるアイデンティティーを持つことは同じはずだ)。これにより、リストの結合により、新しいリスト(オブジェクト)が作成されたことが分かる。
その一方で、「+=」演算子の場合は、アイデンティティーは「140318232637320」であり、その直前のものと変わっていないことにも注目しよう。「somelist = somelist + anotherlist」と「somelist += anotherlist」は「リストを結合する」という意味では同一の操作だが、実際には最終的なオブジェクトのアイデンティティーが異なるので、完全に同一ではない。とはいえ、難しいことなので、最初はあまり気にする必要はないが、頭のどこかに入れておきたい。
リストの要素を削除するには、del文を使用する。これには「del」に続けて(空白文字を置き、そこに続けて)リストの要素を指定する。例えば、先ほどリストlanguagesに追加した「99」という要素をリストから削除するには次のようにする。
del languages[5]
print(languages)
実行結果を以下に示す。
あるいは、リストが持つremoveメソッドも使用できる(これは上のappendメソッドと対になるものだ)。引数には削除したい要素の値を指定する。例えば、上のリストから文字列'PHP'をその値とする要素を削除するには次のようにする。
languages.remove('PHP')
print(languages)
del文では、インデックスを指定したが、removeメソッドでは削除したい値を指定する点には注意しよう。ちなみに、リストに同じ値が2つあったときには、インデックスの小さい要素が削除される。以下に例を示す。
intlist = [1, 2, 3, 1, 2, 3]
intlist.remove(3)
print(intlist)
このコードを実行すると、次のようになる。
このプログラムでは、「1」「2」「3」「1」「2」「3」という要素を格納しているリストに対して、引数を「3」としてremoveメソッドを呼び出している。その結果、値が「3」となる全ての要素が削除されるのではなく、インデックスが小さい方の要素(削除前のintlist[2])が削除されているのが分かる。
なお、del文はリストの要素を削除するだけではなく、リストそのものを削除するのにも使える。以下に例を示す。
del languages
print(languages)
これを実行すると次のようになる。
print関数の実行で「NameError」が発生している。その説明を日本語にすると「'languages'という名前は定義されていませんよ」となる。これは、その前のdel文でリストを代入した変数languagesを削除しているからだ(より正確には、「languages」という「名前」を削除して、リストオブジェクトとの関連付けを解除した)。
Copyright© Digital Advantage Corp. All Rights Reserved.