python列表索引是相同的列表

时间:2013-03-10 17:10:21

标签: python list indexing

我刚看到如下输出 - 只想知道这里发生了什么。

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

为什么l [0]值显示如下?任何人都可以解释为什么这种行为。 我以为它会像[[1,2,3,4],2,3,4]那样回归。

干杯, 卡莱

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]

答案 2 :(得分: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