Разница функции и процедуры в python?
Функция должна принимать аргументы и возвращать какие-то данные. Почему в этом коде функция работает по факту как процедура, изменяя аргументы, которые были поданы? Спасибо
def cofactor(array, i, q): #алгебраическое дополнение ((−1)^(i+j) * Mi,j)
for k in range(i):
array[k].pop(q)
array.pop(i)
return array
#return (-1)**(i + q) * determinant(array)
array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for i in range(3):
for q in range(3):
print('array: ', array)
print(cofactor(array, i, q))```
Ответы (2 шт):
В питоне нет понятия процедуры, только функции и методы (это функции у классов).
И объекты в нем передаются по ссылке.
Кроме того, список array является изменяемыми, поэтому, если не хотите поменять его внутри функции и вернуть измененную копию, то сделайте копирование списка через copy.deepcopy:
import copy
def cofactor(array, i, q): #алгебраическое дополнение ((−1)^(i+j) * Mi,j)
array = copy.deepcopy(array)
for k in range(i):
array[k].pop(q)
array.pop(i)
return array
В питоне вообще нет разницы между функцией и процедурой. В питоне даже если вы ничего не вернёте с помощью return в явном виде, по факту вернётся значение None.
Далее. В других языках точно такая же история с ссылочными типами, переданными в процедуру/функцию, которое вы наблюдаете в этом коде: вы не можете поменять сам указатель на переданный объект, но вы легко можете поменять его содержимое.
Да, это не очень хороший стиль, когда процедура/функция меняет что-то переданное ей, чего вы не ожидаете, но от такого поведения нет никакой страховки.