《29》連結:メソッド extend〈Python 2.x 版〉

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

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
2009年2月23日(月)

今日の進捗

  • Language Reference: Numeric and Mathematical Modules; functools — Higher order functions and operations on callable objects
  • Python.use(better) -- セミナー研修テキスト
  • 連結リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 土日を使って高階関数について頭の中を整理しておきました。
担当:伊藤/本間 。(^^)

連結:メソッド extend

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

def ex():
    s = myList("ABC")
    ss = "","D","EF"
    for i in range(3):
        t = ss[i]
        print "-->",s,`t`,"\t#",s.__class__.__name__
        s.extend(t)
        print "<--",s    ,"\t#",s.__class__.__name__

>>> ex()
    • > ['A', 'B', 'C'] '' # myList
<-- ['A', 'B', 'C'] # myList
    • > ['A', 'B', 'C'] 'D' # myList
<-- ['A', 'B', 'C', 'D'] # myList
    • > ['A', 'B', 'C', 'D'] 'EF' # myList
<-- ['A', 'B', 'C', 'D', 'E', 'F'] # myList

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

>>> 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/01