Передача по значению и передача по ссылке - это два термина, которые иногда могут вводить в заблуждение, и они не всегда означают одно и то же в каждом языке. Я собираюсь предположить, что мы понимаем, что означают два термина в C (где ссылка передает указатель на переменную).
Python на самом деле ни один из них, я приведу вам пример, который я взял из статьи (все благодарности оригинальному писателю, я свяжу статью в конце)
def spam(eggs):
eggs.append(1)
eggs = [2, 3]
ham = [0]
spam(ham)
print(ham)
Когда вызывается spam
, и ham
, и eggs
указывают на одно и то же значение ([0]) на один и тот же объект. Таким образом, когда eggs.append (1)
выполняется, [0] становится [0, 1]. Это звучит как передача по ссылке.
Однако, когда eggs = [2, 3]
, теперь и eggs
, и ham
должны стать новым списком при передаче по ссылке. Но этого не происходит; теперь eggs
указывает на список в памяти, содержащий [2, 3], но ham
по-прежнему указывает на исходный список с добавленной к нему 1. Этот бит больше похож на проход по значению.
EDIT
Как объяснено выше, если параметр потока изменяется внутри него, изменения будут видны в исходном потоке, пока параметр является изменяемым. Таким образом, передача списка потоку и добавление чего-либо к нему будет отражено, например, в потоке вызывающего.
Однако неизменный объект нельзя изменить. Если вы делаете i += 1
, вы не изменяете целое число, целые числа неизменны в Python. Вы присваиваете i
новое целое число со значением на единицу выше, чем предыдущее. Это то же самое, что случилось с eggs = [2, 3]
. Таким образом, в этом конкретном примере изменения не будут отражены в исходной ветке.
Надеюсь, это поможет!
Вот статья, которую я обещал, она гораздо лучше объясняет этот вопрос. http://stupidpythonideas.blogspot.com/2013/11/does-python-pass-by-value-or-by.html?m=1