В классе Python (OOP) методы, которые работают на месте (изменяют self
или его атрибуты), являются приемлемыми и, во всяком случае, более распространенными, чем те, которые возвращают новый объект.Это также верно для встроенных классов, таких как dict
или list
.
Например, в numpy
мы часто рекомендуем list append
подход к построению нового массива:
In [296]: alist = []
In [297]: for i in range(3):
...: alist.append(i)
...:
In [298]: alist
Out[298]: [0, 1, 2]
Это достаточно часто, чтобы мы могли легко написать его как понимание списка:
In [299]: [i for i in range(3)]
Out[299]: [0, 1, 2]
alist.sort
работает на месте, sorted(alist)
возвращает новый список.
В numpy
методы, которые возвращают новый массив, встречаются гораздо чаще.На самом деле sort
- это единственный метод на месте, который я могу придумать не по назначению.Это и прямое изменение shape
: arr.shape=(...)
.
Ряд базовых операций с numpy возвращает view
.Это разделяет память данных с источником, но оболочка объекта массива является новой.Фактически, даже индексирование элемента возвращает новый объект.
Поэтому, хотя в конечном итоге вам необходимо проверить документацию, обычно можно предположить, что пустая функция или метод возвращает новый объект, а не работает на месте.
Чаще всего пользователей смущают функции, которые имеют то же имя, что и метод.В большинстве этих случаев функция проверяет, что аргумент (ы) является массивом, а затем делегирует действие своему методу.Также имейте в виду, что в Python операторы переводятся в вызовы методов - от +
до __add__
, [index]
до __getitem__()
и т. Д. +=
является своего рода операцией на месте.