我刚刚看到如下输出 - 只是想知道这里发生了什么。
>>> 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