Что это значит?


95

Я анализирую код Python и не знаю, что

pop = population[:]

средства. Это что-то вроде списков массивов в Java или двумерных массивов?


1
В связи с этим очистка списка возможна только с помощью del pop [:] или pop [:] = [], а не pop.clear () .. (как вы делаете с dicts).
Macke

Хорошее обсуждение фрагмента Python в SO: stackoverflow.com/questions/509211/…
Скотт Уилсон

Ответы:


109

Это пример нотации срезов, и то, что она делает, зависит от типа population. Если populationэто список, эта строка создаст мелкую копию списка. Для объекта типа tupleили a strон ничего не будет делать (строка будет делать то же самое без [:]), а для (скажем) массива NumPy он создаст новое представление для тех же данных.


14
На всякий случай: срез возвращает неглубокую копию.
Андре Карон

4
@ilius: Может, l.copy()и читабельнее, но не сработает.
Sven Marnach

13
list(l)всегда работает, более читабельно и гарантированно вернет копию даже с чем-то вродеnumpy.array
Рош Оксюморон

1
@Eli: Да, рядом list.clear(). Однако пройдет некоторое время, прежде чем это приведет к значительному сокращению количества подобных вопросов по SO. :)
Sven Marnach

1
@MichaelGraczyk: Я полагаю, вы здесь говорите о массивах NumPy. Вместо того чтобы использовать A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], я почти всегда предпочитаю numpy.rollaxis(A, axis, 0)[k]. В общем, я редко встречал вариант использования, когда вам нужно было бы напрямую создавать slice()объекты. Если они вам все равно нужны, NumPy предоставляет s_помощника в качестве альтернативного способа их создания.
Sven Marnach

27

Также может быть полезно знать, что срез списка в целом является копией части списка. Например population[2:4], вернет список, содержащий совокупность [2] и совокупность [3] (нарезка является исключительной). Оставив левый и правый индекс, по population[:]умолчанию они равны 0 и длине (совокупности) соответственно, тем самым выбирая весь список. Следовательно, это обычная идиома для создания копии списка.


15

ну ... это действительно зависит от контекста. В конце концов, он передает sliceобъект ( slice(None,None,None)) к одному из следующих способов: __getitem__, __setitem__или __delitem__. (На самом деле, если у объекта есть __getslice__, он будет использоваться вместо __getitem__, но теперь он устарел и не должен использоваться).

Объекты могут делать с срезом все, что захотят.

В контексте:

x = obj[:]

Это вызовет obj.__getitem__переданный объект среза. Фактически, это полностью эквивалентно:

x = obj[slice(None,None,None)]

(хотя первый вариант, вероятно, более эффективен, потому что ему не нужно искать sliceконструктор - все это делается в байт-коде).

Для большинства объектов это способ создать неглубокую копию части последовательности.

Следующий:

x[:] = obj

Это способ установить элементы (он вызывает __setitem__) на основе obj.

и, я думаю, вы можете догадаться, что:

del x[:]

звонки ;-).

Также можно передавать разные срезы:

x[1:4]

конструкции slice(1,4,None)

x[::-1]

конструкции slice(None,None,-1)и пр. Дополнительная литература: объяснение нотации фрагментов Python




5

[:]
используется для ограничителя или нарезки в массиве, хеш,
например:
[1: 5] для отображения значений от 1 включительно до 5 исключительных, т.е. 1-4
[начало: конец] в

основном используется в массиве для нарезки, понять скобку принять переменную, которая означает значение или ключ для отображения, а ":" используется для ограничения или разделения всего массива на пакеты.


1
Нет причин сталкиваться с таким старым вопросом, на который уже есть 5 похожих ответов и даже принятый ... Кроме того, a[1:5]возвращает элементы 1-4, а не 2-4.
Skamah One

@SkamahOne О, я не знаю. Может быть, не в этом случае, но бывают случаи, когда полезно задать мертвые вопросы. Другой взгляд, другая формулировка и т. Д. В этом случае вы исправили ответ, и они, надеюсь, тоже кое-что узнали.
Прифтан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.