2009-03-25 2 views
7

Чтобы не сказать, что вы хотите, чтобы последний элемент списка питона: какова разница междуВ чем разница между списком [-1:] [0] и списком [len (list) -1]?

myList[-1:][0] 

и

myList[len(myList)-1] 

Я думал, что не было никакой разницы, но тогда я попробовал этот

>>> list = [0] 
>>> list[-1:][0] 
0 
>>> list[-1:][0] += 1 
>>> list 
[0] 
>>> list[len(list)-1] += 1 
>>> list 
[1] 

Я был немного удивлен ...

+1

Не знаю, почему вы пишете 'список [-1:] [0]'; обычный способ написать это просто «list [-1]». Кроме того, вы, вероятно, хотите избежать затенения встроенного 'list()', назвав свой список 'list'. – kquinn

ответ

14

если вы используете slicing [-1:], возвращенный список является мелкой копией, а не ссылкой. поэтому [-1:] [0] изменяет новый список. [len (list) -1] - ссылка на последний объект.

9

list[-1:] создает новый список. Чтобы получить то же поведение, что и list[len(list)-1], он должен был бы вернуть вид какого-то list, но, как я уже сказал, он создает новый временный список. Затем перейдите к редактированию временного списка.

В любом случае, вы можете использовать list[-1] для того же, не так ли?

+0

Um ... right ... Я знал это ... – c0m4

3

Нарезка создает копию (мелкой копии). Он часто используется как неглубокая копия.

т.е.

list2 = list1[:] 

эквивалентно

import copy 
list2 = copy.copy(list1) 
+0

, что кажется менее читаемым/понятным, чем использование копии ... Есть ли причина, по которой он «часто используется»? – tgray

+0

Я согласен, что это менее читаемо. Почему он используется? Наверное, это потому, что он не требует импорта. – vartec

+0

Считаете ли вы, что они избегают импорта, потому что это требует другой строки кода или потому, что они пытаются избежать каких-либо накладных расходов (памяти, времени загрузки и т. Д.)? – tgray

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