当我偶然发现以下片段时,我只是在看functools.lru_cache的实现:

root = []  # root of the circular doubly linked list
root[:] = [root, root, None, None]  # initialize by pointing to self

我熟悉循环和双重链接列表。我也知道new_list = my_list[:]创建了my_list的副本。
在寻找切片分配或圆形双向链表的其他实现时,我找不到有关此特定语法的任何更多信息。

问题:
  • 在这种情况下发生了什么。
  • 是否有其他语法可以达到相同的结果?
  • some_list[:] =some_iterable是否有不同的常见用例(无自引用)?
  • 最佳答案


    root[:] = [root, root, None, None]
    

    左手切片分配只是说root的引用被重用来保存右部分的内容。

    因此,root引用永远不会改变,是的,在列表中您可以引用自己(但不要尝试对它们进行递归展平:)。在这种情况下,表示形式显示“列表上的递归”。
    >>> root
    [<Recursion on list with id=48987464>,
     <Recursion on list with id=48987464>,
     None,
     None]
    

    并打印出来显示省略号:
    >>> print(root)
    [[...], [...], None, None]
    

    请注意,您不需要为此分配切片。有一些简单的方法可以触发递归:
    >>> root = []
    >>> root.append(root)
    >>> root
    [<Recursion on list with id=51459656>]
    >>>
    

    众所周知,使用append不会更改引用,它只是对列表进行了变异,为其自身添加了引用。也许更容易理解。

    10-05 17:40
    查看更多