自己参照するリスト

初めてのPython 3章の演習問題より。

>>> L = [1, 2]
>>> L
[1, 2]
>>> L.append(L)
>>> L
[1, 2, [...]]
>>> L.append(L)
>>> L
[1, 2, [...], [...]]
>>> L[3]
[1, 2, [...], [...]]
>>> if L[3] == L:
...     print 'OK'
... 
OK
>>> L[0]
1
>>> L[3][0]
1
>>> L[3][3][0]
1
>>>

Javaで同じことやったらどうなるんだろう? 実際にやってみた。

import java.util.ArrayList;

public class ListTest {

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add(list);

        System.out.printf("list size : %d\n", list.size());
        for (Object obj : list) {
            System.out.printf("list : %s\n", obj);

            if (obj instanceof ArrayList) {
                ArrayList nestedList = (ArrayList) obj;
                System.out.printf("nestedList size : %d\n", nestedList.size());
                for (Object nestedObj : nestedList) {
                    System.out.printf("nestedList : %s\n", nestedObj);
                }
            }
        }
    }
}

[実行結果]
list size : 3
list : aaa
list : bbb
list : [aaa, bbb, (this Collection)]
nestedList size : 3
nestedList : aaa
nestedList : bbb
nestedList : [aaa, bbb, (this Collection)]

pythonと同じように、自己参照しているみたい。自分を指すポインタをlistの要素に持っているというだけの話か。

追記:JavaScript(firebug console)でもやってみた。

>>> list = [1,2,3]
[1, 2, 3]
>>> list
[1, 2, 3]
>>> list[3] = list
[1, 2, 3, [1, 2, 3, 1 more...]]
>>> list[3]
[1, 2, 3, [1, 2, 3, 1 more...]]
>>> list[3][2]
3
>>> list[3][3][1]
2