以下のような出力を見ました - ここで何が起こっているのか知りたいだけです。
>>> l = [1,2,3,4]
>>> l[0]=l
>>> l
[[...], 2, 3, 4]
l[0] の値がこのように表示されるのはなぜですか? なぜこのような振る舞いをするのか、誰でも説明できますか。[[1,2,3,4], 2, 3, 4] のように返されると思っていました。
乾杯、カライ
...
そうしないと、無限に再帰する必要があるためです。
Python のリスト オブジェクトはリストへのポインタです。これを割り当ててl[0] = l
もコピーは作成されません。たとえば、試してみてください
l1 = [1, 2, 3, 4]
l2 = [1, 2]
l2[0] = l1
print l2
# [[1, 2, 3, 4], 2]
l2[0].append(5)
print l1
# [1, 2, 3, 4, 5]
l1
明示的に変更していなくても、追加されていることに注意してください。
したがって、リストをそれ自体の中に配置すると、リストのその項目は依然としてリスト全体へのリンクになります。上記のコードの後、次のことを試してください。
l[1] # ==> 2
l[0][1] # ==> 2
l[0][0][1] # ==> 2
リストのコピーを使用して、無限再帰を回避します。
In [10]: l = [1,2,3,4]
In [11]: l[0] = l[:]
In [12]: l
Out[12]: [[1, 2, 3, 4], 2, 3, 4]
PrettyPrinter を使用した場合、出力は一目瞭然です。
>>> l = [1,2,3,4]
>>> l[0]=l
>>> l
[[...], 2, 3, 4]
>>> pp = pprint.PrettyPrinter(indent = 4)
>>> pp.pprint(l)
[<Recursion on list with id=70327632>, 2, 3, 4]
>>> id(l)
70327632