Що означає?


95

Я аналізую деякий код Python і не знаю чого

pop = population[:]

засоби. Це щось на зразок списків масивів у Java чи як двовимірний масив?


1
Пов'язане з цим, очищення списку можливо лише виконуючи del pop [:] або pop [:] = [], а не pop.clear () .. (як це робите з диктами).
Макке

Гарне ТО обговорення фрагмента Python: 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(). Однак це займе деякий час, поки це не призведе до значного зменшення такого роду питань щодо СО. :)
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 та довжину (сукупність) відповідно, вибираючи таким чином весь список. Отже, це загальна ідіома створення копії списку.


15

ну ... це насправді залежить від контексту. В кінці кінців, він передає 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



6

Він створює копію списку на відміну від просто присвоєння нового імені вже існуючому списку.


5

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

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


1
Немає жодної причини кидати таке старе запитання, яке вже має 5 подібних відповідей і навіть прийняте ... Крім того, a[1:5]повертає елементи 1-4, а не 2-4.
Скама One

@SkamahOne О, я не знаю. Можливо, не в цьому випадку, але бувають випадки, коли може бути корисним підняти мертві питання. Різне розуміння, різне формулювання тощо. У цьому випадку ви виправили відповідь, і вони, сподіваємось, теж щось дізналися.
Прифтан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.