2014-06-22 2 views
4

Что произойдет, если я попытаюсь добавить список самому себе?Что произойдет, если вы добавите список самому себе?

# Let's say empty list is created. 
some_list = [] 
# Now, append it with self 
some_list.append(some_list) 
# Output shows [[...]] on iPython console. 

Что это значит? Выбирает ли some_list рекурсивный список? Что будет со ссылкой на счет some_list? Как сборщик мусора будет относиться к этому? Когда этот some_list будет собран мусором?

+2

* Ли какой-то список становится рекурсивным списком или чем-то еще. Да, мусорщик обрабатывает круглые ссылки. –

ответ

7

Да, вы создали круговую ссылку; объект списка ссылается сам. Это означает, что счетчик ссылок увеличивается на 1 дополнительную ссылку.

Сборщик мусора Python будет обрабатывать этот случай; если больше ничего не ссылается на объект списка, процесс сбора мусора отвечает за нарушение этого круга:

>>> import gc 
>>> some_list = [] 
>>> gc.get_referents(some_list) 
[] 
>>> some_list.append(some_list) 
>>> some_list[0] is some_list 
True 
>>> gc.get_referents(some_list) 
[[[...]]] 
+0

То же самое работает и с 'Dict'? Итак, в целом все изменяемые структуры данных в Python? –

+0

Да, это относится ко всему, что может ссылаться на свой собственный тип, включая словари. –

+0

Большое спасибо @Martijn Pieters. –