《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