Почему итеративная генерация вложенных списков не удаляет внутренний список - PullRequest
0 голосов
/ 30 мая 2018
my_list = ['abc', 'def']

outer_list = []
for element in my_list:
    inner_list = []
    for ch in element:
        inner_list.append(ch)
    outer_list.append(inner_list)
print(outer_list)
# output [['a', 'b', 'c'], ['d', 'e', 'f']]

Мой вопрос: почему это работает?то есть, почему line inner_list = [] не стирает предыдущие экземпляры inner_list?Я думаю, что это связано с тем, что external_list выходит за пределы блока for.Возможно, как только inner_list поселяется там, он отсоединяется от имени переменной?Это близко?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Предлагаю вам рассмотреть эти 2 случая с полным объяснением в комментариях:

  1. Дело с list = []:

    my1stList = [1, 2 ,3, 4, 5]  # my1stList references  the list [1, 2 ,3, 4, 5]
    my2ndList = my1stList        # my2ndList references the same list as my1stList
    my1stList = []               # my1stList references another list (which is empty)
    print(my2ndList)             # it prints: [1, 2, 3, 4, 5]
    
  2. Случай с list[:] = []:

    my1stList = [1, 2 ,3, 4, 5]  # my1stList references the list [1, 2 ,3, 4, 5]
    my2ndList = my1stList        # my2ndList references the same list as my1stList
    my1stList[:] = []            # the list referenced by my1stList is emptied
    print(my2ndList)             # it prints: []
    

Надеюсь, теперь это понятно для вас: каждый список, который вы добавляете в outer_list, никогда не перезаписывается.Изменяется только предыдущая ссылка inner_list.

0 голосов
/ 30 мая 2018

Когда вы запускаете inner_list=[], переменная просто указывает на другой адрес в памяти.outer_list по-прежнему указывает на старый адрес памяти (предыдущий inner_list).Пока на него есть указатель, он не будет освобожден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...