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

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 и длине (совокупности) соответственно, тем самым выбирая весь список. Следовательно, это обычная идиома для создания копии списка.

ThomasH
источник
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

мгильсон
источник
10

Это фрагмент от начала последовательности до конца, обычно образующий неглубокую копию.

(Ну, это даже больше , но вам пока не нужно беспокоиться.)

Игнасио Васкес-Абрамс
источник
6

Он создает копию списка, а не просто присваивает новое имя уже существующему списку.

Джим Бриссом
источник
5

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

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

Виджей Балкришна Кондускар
источник
1
Нет причин сталкиваться с таким старым вопросом, на который уже есть 5 похожих ответов и даже принятый ... Кроме того, a[1:5]возвращает элементы 1-4, а не 2-4.
Skamah One
@SkamahOne О, я не знаю. Может быть, не в этом случае, но бывают случаи, когда полезно задать мертвые вопросы. Другой взгляд, другая формулировка и т. Д. В этом случае вы исправили ответ, и они, надеюсь, тоже кое-что узнали.
Прифтан