параметры: передается по ссылке против переданного по имени - PullRequest
1 голос
/ 09 мая 2011

В чем разница между режимами передачи параметров, передаваемыми по ссылке и передаваемыми по имени, здесь является примером в 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

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

Ответы [ 3 ]

5 голосов
/ 09 мая 2011

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

1 голос
/ 25 октября 2012

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

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-Pass-технике Проверьте этот charpter "Методы передачи параметров", и вы найдете свой ответ.

0 голосов
/ 10 мая 2011

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

def foo(x):
    x = x+1

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

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

Делает ли этосмысл? * * 1006

...