【问题标题】:parameters : passed by reference vs passed by name参数:通过引用传递与通过名称传递
【发布时间】:2011-08-21 21:12:06
【问题描述】:

引用传递和名称传递的参数传递方式有什么区别这里是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

对吗?

【问题讨论】:

  • 我不明白你在问什么。您是在询问事情在 python 中的工作方式或原因吗?
  • @Matth 其实我只是用了python语法,我真正想知道的是引用传递和名称传递的区别。
  • 因为它适用于什么语言?
  • 仅供参考,在第一种情况下,您的输出不正确;它将是 7, 1 而不是 7, 2
  • 我认为在过去的 40 年里没有任何一种语言有名字传递

标签: python parameter-passing pass-by-reference


【解决方案1】:

在 Python 中,您拥有可变或不可变的对象。所有名称都是对对象的引用。换句话说,一切都是参考。您不会在 Python 中“按值传递”。只有通过引用传递。如果您尝试修改不可变对象(例如数字或字符串),您会自动获得一个新副本。您可以返回该新值。如果您传递一个可变对象(例如 list 或 dict),则该对象已被修改,您不必返回它。如果你不希望你应该先复制你的对象。您可以使用 dict.copy()list[:] 语法。

【讨论】:

  • python示例只是为了说明我遇到的问题,假设没有python规则?
  • 您是否认为您使用的是其他语言?
  • 我是这样理解的:OP 有一个关于按引用调用与按名称调用的问题,并为示例选择了 Python 语法。 (如果我错了,请纠正我。)
  • 即使这不是 OP 所要求的,这对我来说也是一个非常有用的答案。谢谢。
【解决方案2】:

我不确定这是否是您所要求的,但我可以解释按引用调用和按名称调用之间的区别。如果您通过引用调用带有参数的函数,则对该变量的任何修改都会在调用它的函数中更改它。例如,如果以下函数通过引用获得 x:

def foo(x):
    x = x+1

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

这将打印 6。如果您按名称调用它,它将打印 5。

这有意义吗?

【讨论】:

  • 不,打印 5 将是按值传递。不是按名称传递。
【解决方案3】:

它们几乎相同。但有时它们的工作方式不同。这是一个例子。

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。查看本章“参数传递技术”,您会找到答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2020-12-06
    • 2013-04-21
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多