Я аналізую деякий код 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.