1

以下のような出力を見ました - ここで何が起こっているのか知りたいだけです。

>>> l = [1,2,3,4]
>>> l[0]=l
>>> l
[[...], 2, 3, 4]

l[0] の値がこのように表示されるのはなぜですか? なぜこのような振る舞いをするのか、誰でも説明できますか。[[1,2,3,4], 2, 3, 4] のように返されると思っていました。

乾杯、カライ

4

3 に答える 3

5

...そうしないと、無限に再帰する必要があるためです。

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
于 2013-03-10T17:11:25.933 に答える
3

リストのコピーを使用して、無限再帰を回避します。

In [10]: l = [1,2,3,4]

In [11]: l[0] = l[:]

In [12]: l
Out[12]: [[1, 2, 3, 4], 2, 3, 4]
于 2013-03-10T17:12:37.850 に答える
0

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
于 2013-03-10T17:39:33.663 に答える