2016-09-25 6 views
3

Я нахожусь в самом начале изучения Python 3. Изучаем основы языка. Существует метод с типом данных списка:Может ли кто-нибудь объяснить это выражение: a [len (a):] = [x], эквивалентное list.append (x)

list.append(x) 

и в учебнике говорится, что эквивалентно этому выражению:

a[len(a):] = [x] 

Может кто-то пожалуйста, объясните это выражение? Я не могу схватить len (a): часть. Правильно? От последнего элемента до последнего? Не могу понять.

Я знаю, что это очень новичок, извините. Я полна решимости изучить Python для сценариев Blender и Game Engine и хочу хорошо понимать все конструкции.

+1

Это не совсем понятно. Вы уверены, что это не 'a.append (x)' –

+0

В некотором смысле 'a.append (x)' эквивалентен unPythonic 'a [len (a):] = [x]' (чистый результат заключается в том, чтобы мутировать «а» таким же образом). Но в другом смысле они не эквивалентны тому, что они соответствуют очень разному байтовому коду. Последнее почти наверняка намного менее эффективно, чем первое. –

ответ

11

Вспомните, как работают кусочки: a[beginning:end]. Если вы не представили ни одного из них, вы получите полный список от beginning или до end.

Что это значит, если я прошу a[2:], я буду получать список из индекса 2 весь путь до конца списка и len(a) является индекс сразу после последнего элемента массива ... так a[len(a):] в основном пустой массив, расположенный сразу после последнего элемента массива.

Скажем, у вас есть a = [0,1,2], и вы a[3:] = [3,4,5], что вы хотите сказать, Python является то, что сразу после [0,1,2 и прямо перед ], должно быть 3,4,5. Таким образом a станет [0,1,2,3,4,5], и после этого шаг a[3:] действительно будет равен [3,4,5] так же, как вы заявили.

Редактировать: как комментирует chepner, любой индекс, отличный от len(a), будет работать так же хорошо. Например, a = [0,1,2] и a[42:] = [3,4,5] также приведут к тому, что a станет [0,1,2,3,4,5].

+2

Следует отметить, что проверка границ не относится к срезам; 'a [x:] == []' for * all * 'x> = len (a)'. – chepner

5

Можно вообще сказать, что l[len(l):] = [1] похож на append, and that is what is stated in the docs, но, что это особый случай , что справедливо только тогда, когда правая часть имеет единственный элемент.

В более общем случае безопаснее утверждать, что это эквивалентно extend по следующим причинам:

Append принимает объект и добавляет, что к концу; с назначением среза вы продлить список с данной Iterable на правой стороне:

l[len(l):] = [1, 2, 3] 

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

l.extend([1, 2, 3]) 

Тот же аргумент append вызовет [1, 2, 3], который будет добавлен в качестве объект в конце l.В этом случае len(l) просто используется для расширения списка, который должен быть выполнен в конце l.

Некоторые примеры, чтобы проиллюстрировать их отличие:

l = [1, 2] 
l[len(l):] = [1, 2] # l becomes [1, 2, 1, 2] 
l.extend([1, 2])  # l becomes [1, 2, 1, 2, 1, 2] 
l.append([1, 2])  # l becomes [1, 2, 1, 2, 1, 2, [1, 2]] 

Как вы заметили, l.append(<iterable>) фактически не добавляет каждое значение в итерацию, он добавляет сам Iterable.