2016-11-13 6 views
0

Я просто наткнулся на следующем Python 2.6 Python'овского кодаКлиринговый список питона с оператором ломтика копией

for i in elements[:]: 
    elements.remove(i) 

Я пытаюсь выяснить причину, чтобы использовать этот синтаксис для очистки списка. Я понимаю концепцию INPLACE удаления, но почему бы не например

del elements[:] 

или

elements[:] = [] 

Thx!

+0

Если в цикле нет условия, тогда нет необходимости использовать петлю. Возможно, автор не знает о других методах. –

+0

Плохой код. Вы видели это здесь? Возможно, это просто демоверсия копирования списка, чтобы избежать ошибок при удалении во время итерации. – tdelaney

+0

Код такой, как есть. И это какой-то «реальный» код. Но спасибо, ты утешишь меня в том, что я думал. Но когда дело доходит до понимания чужого кода, я всегда боюсь пропустить какой-то тонкий момент ... –

ответ

0

Вы должны думать о списках Python как «указатели».

Например, если вы объявите список как так:

elements = [1, 2, 3] 

Это будет видно в памяти, как это:

elements → [ ↓, ↓, ↓ ] 
      1 2 3 

Итак, когда вы изменить элемент в списке вы делаете что-то вроде этого:

elements[1] = 4 
       4 
elements → [ ↓, ↑, ↓ ] 
      1 2 3 

Обратите внимание, что номер 2 не имеет ссылки на указатель, поэтому он будет «ушел» r потерян из памяти ", и он больше не доступен. Так что же происходит, когда вы переназначить саму переменную:

elements[:] = [] 

     [] 
elements ↑  [ ↓, ↓, ↓ ] 
       1 4 3 

Ключ, чтобы понять, является то, что первоначальный список также «ушел или потерял из памяти» и он больше не доступен. Еще один важный ключ, который следует понимать, заключается в том, что нарезка:

elements[:] Получите указатель (или стрелку на моих иллюстрациях), на которую ссылается переменная.

Так вот почему это точно так же использовать

del elements[:] (я удалить стрелку и установить новую стрелу в пустой список)

или

elements[:] = [] (я делаю переменную Теперь точка в новый пустой список, старая стрелка будет удалена при разыменовании)

Надеюсь, это поможет!

+0

Спасибо за ваш ответ, я знаю, что вы объясняете ... И кто-то меня исправляет, если я ошибаюсь, но «элементы del [:] и элементы [:] = []« на самом деле не удалить список, он опустошает его «inplace». то есть идентификаторы (элементы) до и после являются одинаковыми ...Мой вопрос касался некоторой тонкости в синтаксисе «для», о котором я упоминал. –

Смежные вопросы