在分析 Python 列表时,我惊讶地发现,在其他编程语言中不可能实现这一点。假设我有一个名为my_list
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_list、my_list[9]和 时my_list[9][9],所有这些都会产生相同的结果。
my_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])此操作时,它会给我type。list
[...]
type(my_list[9])
type
list
[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
my_list[9] = my_list
任何帮助都将不胜感激。
这是可能的,因为列表(像其他容器一样)存储引用,但为什么不存储它自己的引用呢?
__str__/函数__repr__已受到保护以避免无限递归,而是显示省略号 ( ...)。
__str__
__repr__
...
为什么这是可能的?因为这并非不可能。如果 Python 要阻止这种情况,就意味着每次将对象添加到列表中时都要检查自引用。这要么是维护引用缓存的额外 O(n) 存储开销,要么是执行引用搜索的 O(n) 时间开销。