小能豆

Python 中的自引用列表?

py

在分析 Python 列表时,我惊讶地发现,在其他编程语言中不可能实现这一点。假设我有一个名为my_list

my_list = [1,2,3,4,5,6,7,8,9,10] 

接下来当我这样做

my_list[9] = my_list  #I didn't seen such things possible in C/C++

当我打印my_listmy_list[9]和 时my_list[9][9],所有这些都会产生相同的结果。

my_list
[1, 2, 3, 4, 5, 6, 7, 8, 9, [...]]
my_list[9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, [...]]
my_list[9][9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, [...]]

我的理解是,指的my_list[9]是称为的相同列表my_list,并且[...]意味着自引用列表,即指向相同列表的列表,当您执行type(my_list[9])此操作时,它会给我typelist

[1, 2, 3, 4, 5, 6, 7, 8, 9, [...]]
                              |
             Does it like self referential struct pointer concept of C ?

上面的my_list例子我只是为了简单的测试运行而添加的。我想知道诸如此类的事情是如何让 Python 代码性能更好的。在 Python 中实现my_list[9] = my_list这一点的实际意图是什么?my_list[9] = my_list

任何帮助都将不胜感激。


阅读 6

收藏
2024-12-23

共1个答案

小能豆

这是可能的,因为列表(像其他容器一样)存储引用,但为什么不存储它自己的引用呢?

__str__/函数__repr__已受到保护以避免无限递归,而是显示省略号 ( ...)。

为什么这是可能的?因为这并非不可能。如果 Python 要阻止这种情况,就意味着每次将对象添加到列表中时都要检查自引用。这要么是维护引用缓存的额外 O(n) 存储开销,要么是执行引用搜索的 O(n) 时间开销。

2024-12-23