【问题标题】:python list index is the same list [duplicate]python列表索引是相同的列表[重复]
【发布时间】:2013-02-25 19:55:58
【问题描述】:

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

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

为什么 l[0] 的值会这样显示?谁能解释我为什么会出现这种行为。 我在想它会像 [[1,2,3,4], 2, 3, 4] 一样返回。

干杯, 卡莱

【问题讨论】:

  • 这是不是分配了实际地址并转至某些有线输出的东西?因为,当我尝试下面的一个时,它工作正常。 >>> l = [1,2,3,4] >>> l[1]=l[:] >>> l [1, [1, 2, 3, 4], 3, 4]
  • @Kalai:我的回答能解释吗? l[:] 复制列表,否则它仍然是指向原始列表的指针。

标签: python list indexing


【解决方案1】:

它显示...,否则它将不得不无限递归。

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

【讨论】:

    【解决方案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]
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 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
      

      【讨论】:

        猜你喜欢
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多