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 回答