当我偶然发现以下片段时,我只是在看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
不会更改引用,它只是对列表进行了变异,为其自身添加了引用。也许更容易理解。