《29》連結:メソッド extend〈Python 3.0 版〉

実録:はじめてのプログラミング記事一覧
《29》連結:メソッド extend

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月23日(月)

連結:メソッド extend

組み込み型 list と同様に、メソッド extend を利用してリストを連結できると便利です。すると、

def ex_extend():
    X = 's = myList("ABC"); s'
    print(">>>",X)
    eval(compile(X,"","single"))
    for e in "","D","EF":
        X = 's.extend({0!r}); s'.format(e)
        print(">>>",X)
        eval(compile(X,"","single"))

>>> ex_extend()
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.extend(''); s
['A', 'B', 'C']
>>> s.extend('D'); s
['A', 'B', 'C', 'D']
>>> s.extend('EF'); s
['A', 'B', 'C', 'D', 'E', 'F']

一方のリストの末尾に、他方のリスト(に含まれる要素)を連結できるのが分かります。空のリストを連結させても、もとのリストは変化しません。また、次のことから、

>>> s = myList("ABC"); id(s); s
13488176
['A', 'B', 'C']
>>> s.extend(myList("D")); id(s); s
13488176
['A', 'B', 'C', 'D']

メソッド extend では(リストを複製しないで)もとのリストを変化させているのが分かります。リストの末尾に新たな要素を 'D' が追加しても、そのオブジェクトの識別情報 13488176 は変化しません。つまり、メソッド extend の副作用を期待しているのです。そのため、

>>> x = s.extend(myList("EF"))
>>> print x, s
None ['A', 'B', 'C', 'D', 'E', 'F']

メソッド extend はリターン値を持たない(リターン値は None と見なせる)ので、変数 x を介して変化したリストを参照できません。

class myList(object):
    ...
    def extend(self, iterable):
        if not iterable: return
        new = myList(iterable)
        del self.tail.next
        self.tail.next = new.head.next
        self.tail = new.tail
        del new.head

属性 .tail を介して、リストの末尾を参照できるので、これを利用します。また、不要になったオブジェクトは、演算子 del を使って削除しておく必要があります。

Tips

Last updated♪09/03/16