Как в функцию передаются аргументы, по ссылке или по значению
В скобках функции через запятую.
Oct. 10, 2023, Источник
В таких языках как C++ есть переменные, хранящиеся на стеке и в динамической памяти. При вызове функции мы помещаем все аргументы на стек, после чего передаём управление функции. Она знает размеры и смещения переменных на стеке, соответственно может их правильно интерпретировать. При этом у нас есть два варианта: скопировать на стек память переменной или положить ссылку на объект в динамической памяти (или на более высоких уровнях стека). Очевидно, что при изменении значений на стеке функции, значения в динамической памяти не поменяются, а при изменении области памяти по ссылке, мы модифицируем общую память, соответственно все ссылки на эту же область памяти «увидят» новое значение.
В python отказались от подобного механизма, заменой служит механизм связывания (assignment) имени переменной с объектом, например при создании переменной: var = "john"
Интерпретатор создаёт объект «john» и «имя» var, а затем связывает объект с данным именем. При вызове функции, новых объектов не создаётся, вместо этого в её области видимости создаётся имя, которое связывается с существующим объектом. Но в python есть изменяемые и неизменяемые типы. Ко вторым, например, относятся числа: при арифметических операциях существующие объекты не меняются, а создаётся новый объект, с которым потом связывается существующее имя. Если же со старым объектом после этого не связано ни одного имени, оно будет удалено с помощью механизма подсчёта ссылок. Если же имя связано с переменной изменяемого типа, то при операциях с ней изменяется память объекта, соответственно все имена, связанные с данной областью памяти «увидят» изменения.
Oct. 10, 2023, Источник
Аргументы передаются в функцию по ссылке на объект. Это не совсем то же самое, что "по ссылке" в других языках программирования, где ссылки являются указателями на объекты в памяти.
Когда вы передаете аргумент в функцию, вы передаете ссылку на объект, а не сам объект. Это означает, что если вы изменяете значение аргумента внутри функции, то эти изменения будут отражены на самом объекте за пределами функции. Если вы присваиваете новое значение самому аргументу, это не изменит объекта за пределами функции.
Давайте рассмотрим пример:
def modify_list(my_list):
my_list.append(4) # изменяем список, на который ссылается аргумент
my_list = [1, 2, 3] # присваиваем новый список самому аргументу
original_list = [0]
modify_list(original_list)
print(original_list) # Выведет: [0, 4], изменения внутри функции отражены на оригинальном объекте
В этом примере список `original_list` изменяется внутри функции `modify_list()`, добавляя в него элемент 4. Эти изменения отражаются на самом объекте `original_list`, так как мы работаем с одним и тем же списком. Однако, когда мы присваиваем новый список переменной `my_list` внутри функции, это не изменяет объект `original_list`, а только изменяет то, на что ссылается аргумент функции.
Аргументы передаются по ссылке на объект, но поведение может отличаться в зависимости от того, какие операции вы выполняете с аргументами внутри функции.
Feb. 17, 2024, easyoffer