параметры: передаются по ссылке, а не по имени

#python #parameter-passing #pass-by-reference

#python #передача параметров #передача по ссылке

Вопрос:

в чем разница между режимами передачи параметров, передаваемых по ссылке и по имени вот пример на Python, но предположим, что мы не используем никаких правил Python:

 def P(x,y)
   global i
   y=1
   print(x)
   i=2
   print(x,y)
i=0
a = [7,11,13]
P(a[i],i)
P(i,a[i])
  

итак, здесь передача параметров по ссылке даст результат:

  • 7
  • 7, 2
  • 2
  • 2, 1

Заранее прошу прощения, если есть какая-либо ошибка.

передача по имени говорит о том, что мы просто применяем текстовую замену, но я все еще не понимаю, как получить выходные данные, используя вызов по имени. Любая помощь?

вот что я получил, используя передачу по имени:

  • 7
  • 11, 2
  • 2
  • 2, 1

правильно ли это?

Комментарии:

1. Я не понимаю, о чем вы спрашиваете. Вы спрашиваете о том, как или почему все работает в python?

2. @Matth нет, на самом деле я просто использовал синтаксис python, что я действительно хочу знать, так это разницу между передачей по ссылке и передачей по имени.

3. как это применимо к какому языку?

4. к вашему сведению, в первом случае ваш вывод неверен; это было бы 7, 1 вместо 7, 2 .

5. Я не думаю, что какой-либо язык за последние 40 лет имеет передачу по имени

Ответ №1:

В Python у вас есть объекты, которые являются либо изменяемыми, либо неизменяемыми. Все имена являются ссылками на объект. Другими словами, все является ссылкой. В Python вы не «передаете по значению». Существует только передача по ссылке. Если вы пытаетесь изменить неизменяемый объект (например, число или строку), вы автоматически получаете новую копию. Вы можете вернуть это новое значение. Если вы передаете изменяемый объект (например, list или dict), объект изменен, вам не нужно его возвращать. Если вы этого не хотите, вам следует сначала скопировать свой объект. Для этого вы можете использовать синтаксис dict.copy() or list[:] .

Комментарии:

1. Пример python был просто для иллюстрации проблемы, с которой я столкнулся, предположим, что нет правил python?

2. Вы предполагаете, что используете другой язык?

3. Вот как я это понял: у OP возник вопрос о вызове по ссылке против вызова по имени и выбрал синтаксис Python для примера. (Поправьте меня, если я ошибаюсь.)

4. Даже если это было не совсем то, что задал OP, это был очень полезный ответ для меня. Спасибо.

Ответ №2:

Они почти одинаковы. Но иногда они работают по-разному. Вот пример.

 Effect of the call swap (x, y):
  temp := x;
  x := y;
  y := temp
Effect of the call swap (i, x[i]):
  temp := i;
  i := x[i];
  x[i] := temp
It does not work! For example:
Before call: i = 2, x[2] = 5
After call: i = 5, x[2] = 5, x[5] = 2
  

Здесь есть подробное описание scope-binding-papameter-passing-techniques. Проверьте этот раздел «Методы передачи параметров», и вы найдете свой ответ.

Ответ №3:

Я не уверен, что это то, о чем вы просили, но я могу объяснить разницу между вызовом по ссылке и вызовом по имени. Если вы вызываете функцию с параметром по ссылке, любое изменение этой переменной изменит ее в функции, которая ее вызвала. В качестве примера, если следующая функция получила x по ссылке:

 def foo(x):
    x = x 1

def main():
    x = 5
    foo(x)
    print x
  

Это вывело бы 6. Если бы вы вызвали его по имени, вместо этого было бы выведено 5.

Имеет ли это смысл?

Комментарии:

1. Нет, вывод 5 будет передаваться по значению. не передается по имени.