Я анализирую код Python и не знаю, что
pop = population[:]
средства. Это что-то вроде списков массивов в Java или двумерных массивов?
Я анализирую код Python и не знаю, что
pop = population[:]
средства. Это что-то вроде списков массивов в Java или двумерных массивов?
Ответы:
Это пример нотации срезов, и то, что она делает, зависит от типа population
. Если population
это список, эта строка создаст мелкую копию списка. Для объекта типа tuple
или a str
он ничего не будет делать (строка будет делать то же самое без [:]
), а для (скажем) массива 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__
, но теперь он устарел и не должен использоваться).
Объекты могут делать с срезом все, что захотят.
В контексте:
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
Он создает копию списка, а не просто присваивает новое имя уже существующему списку.
[:]
используется для ограничителя или нарезки в массиве, хеш,
например:
[1: 5] для отображения значений от 1 включительно до 5 исключительных, т.е. 1-4
[начало: конец] в
основном используется в массиве для нарезки, понять скобку принять переменную, которая означает значение или ключ для отображения, а ":" используется для ограничения или разделения всего массива на пакеты.
a[1:5]
возвращает элементы 1-4, а не 2-4.