Анализируя список 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_list
, 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
и my_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
я просто добавил для простого тестового прогона. Я хочу знать, как такие вещи, как my_list[9] = my_list
производительность кода python. каково фактическое намерение этого my_list[9] = my_list
делает возможным в python?
Любая помощь будет оценена.
Это возможно, потому что список (как и другие контейнеры) хранит ссылки, а почему бы не ссылку на себя?
Функции __str__
/__repr__
были защищены от этого, чтобы избежать бесконечной рекурсии, и вместо этого показывать многоточие (...
).
Почему это возможно? Потому что это не невозможно. Если бы Python предотвратил это, это означало бы проверку на наличие собственных ссылок каждый раз, когда объект добавлялся в список. Это может быть либо дополнительная нагрузка O (n) для хранения эталонного кэша, либо дополнительная нагрузка O (n) для выполнения поиска эталона.
Списки в python не содержат ничего, кроме ссылок на объекты (например, указатель). Они могут ссылаться на любой объект, включая себя.
list
самом деле не содержит значений, он содержит ссылку на эти значения?