Это пример нотации срезов, и то, что она делает, зависит от типа population. Если populationэто список, эта строка создаст мелкую копию списка. Для объекта типа tupleили a strон ничего не будет делать (строка будет делать то же самое без [:]), а для (скажем) массива NumPy он создаст новое представление для тех же данных.
На всякий случай: срез возвращает неглубокую копию.
Андре Карон
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 и длине (совокупности) соответственно, тем самым выбирая весь список. Следовательно, это обычная идиома для создания копии списка.
ну ... это действительно зависит от контекста. В конце концов, он передает 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.
[:]
используется для ограничителя или нарезки в массиве, хеш,
например:
[1: 5] для отображения значений от 1 включительно до 5 исключительных, т.е. 1-4
[начало: конец] в
основном используется в массиве для нарезки, понять скобку принять переменную, которая означает значение или ключ для отображения, а ":" используется для ограничения или разделения всего массива на пакеты.
Нет причин сталкиваться с таким старым вопросом, на который уже есть 5 похожих ответов и даже принятый ... Кроме того, a[1:5]возвращает элементы 1-4, а не 2-4.
Skamah One
@SkamahOne О, я не знаю. Может быть, не в этом случае, но бывают случаи, когда полезно задать мертвые вопросы. Другой взгляд, другая формулировка и т. Д. В этом случае вы исправили ответ, и они, надеюсь, тоже кое-что узнали.
Ответы:
Это пример нотации срезов, и то, что она делает, зависит от типа
population
. Еслиpopulation
это список, эта строка создаст мелкую копию списка. Для объекта типаtuple
или astr
он ничего не будет делать (строка будет делать то же самое без[:]
), а для (скажем) массива NumPy он создаст новое представление для тех же данных.источник
l.copy()
и читабельнее, но не сработает.list(l)
всегда работает, более читабельно и гарантированно вернет копию даже с чем-то вродеnumpy.array
list.clear()
. Однако пройдет некоторое время, прежде чем это приведет к значительному сокращению количества подобных вопросов по SO. :)A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]
, я почти всегда предпочитаюnumpy.rollaxis(A, axis, 0)[k]
. В общем, я редко встречал вариант использования, когда вам нужно было бы напрямую создаватьslice()
объекты. Если они вам все равно нужны, NumPy предоставляетs_
помощника в качестве альтернативного способа их создания.Также может быть полезно знать, что срез списка в целом является копией части списка. Например
population[2:4]
, вернет список, содержащий совокупность [2] и совокупность [3] (нарезка является исключительной). Оставив левый и правый индекс, поpopulation[:]
умолчанию они равны 0 и длине (совокупности) соответственно, тем самым выбирая весь список. Следовательно, это обычная идиома для создания копии списка.источник
ну ... это действительно зависит от контекста. В конце концов, он передает
slice
объект (slice(None,None,None)
) к одному из следующих способов:__getitem__
,__setitem__
или__delitem__
. (На самом деле, если у объекта есть__getslice__
, он будет использоваться вместо__getitem__
, но теперь он устарел и не должен использоваться).Объекты могут делать с срезом все, что захотят.
В контексте:
Это вызовет
obj.__getitem__
переданный объект среза. Фактически, это полностью эквивалентно:(хотя первый вариант, вероятно, более эффективен, потому что ему не нужно искать
slice
конструктор - все это делается в байт-коде).Для большинства объектов это способ создать неглубокую копию части последовательности.
Следующий:
Это способ установить элементы (он вызывает
__setitem__
) на основеobj
.и, я думаю, вы можете догадаться, что:
звонки ;-).
Также можно передавать разные срезы:
конструкции
slice(1,4,None)
конструкции
slice(None,None,-1)
и пр. Дополнительная литература: объяснение нотации фрагментов Pythonисточник
Это фрагмент от начала последовательности до конца, обычно образующий неглубокую копию.
(Ну, это даже больше , но вам пока не нужно беспокоиться.)
источник
Он создает копию списка, а не просто присваивает новое имя уже существующему списку.
источник
[:]
используется для ограничителя или нарезки в массиве, хеш,
например:
[1: 5] для отображения значений от 1 включительно до 5 исключительных, т.е. 1-4
[начало: конец] в
основном используется в массиве для нарезки, понять скобку принять переменную, которая означает значение или ключ для отображения, а ":" используется для ограничения или разделения всего массива на пакеты.
источник
a[1:5]
возвращает элементы 1-4, а не 2-4.