参数:通过引用传递vs按名称传递

时间:2011-05-09 17:47:25

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

引用传递的参数传递模式和按名称传递的参数传递模式之间的区别是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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

他们几乎一样。但有时他们的工作不同。这是一个例子。

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。检查此章节“参数传递技术”,你会找到你的答案。

答案 2 :(得分:-2)

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

def foo(x):
    x = x+1

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

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

这有意义吗?