Я аналізую деякий код Python і не знаю чого
pop = population[:]
засоби. Це щось на зразок списків масивів у Java чи як двовимірний масив?
Я аналізую деякий код Python і не знаю чого
pop = population[:]
засоби. Це щось на зразок списків масивів у Java чи як двовимірний масив?
Відповіді:
Це приклад позначення фрагментів, і те, що він робить, залежить від типу population
. Якщо population
це список, цей рядок створить неглибоку копію списку. Для об'єкта типу tuple
або a str
він нічого не зробить (рядок буде робити те саме без [:]
), а для (скажімо) масиву NumPy створить нове представлення тих самих даних.
l.copy()
це читабельніше, але це не спрацює.
list(l)
завжди працює, є читабельнішим і гарантовано повертає копію навіть із чимось на кшталтnumpy.array
list.clear()
. Однак це займе деякий час, поки це не призведе до значного зменшення такого роду питань щодо СО. :)
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__
. (Насправді, якщо об’єкт має a __getslice__
, який буде використовуватися замість __getitem__
, але який зараз застарів і не повинен використовуватися).
Об’єкти можуть робити те, що хочуть, із фрагментом.
В контексті:
x = obj[:]
Це буде викликати obj.__getitem__
із переданим об'єктом slice. Фактично, це повністю еквівалентно:
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.