5.5 参数传递


我们来看看这个例子:
def change(a):
    a=a+10
    return a
a=10
b=change(a)
print("a=",a)
print("b=",b)
函数change很简单,把参数增加10,但是运行后发现a的值仍然是10,并没有变成20。而b的值是a增加了10,返回值可以把变化后的参数保留下来。
再来看一个例子:
def swap(a,b):
    t=a;a=b;b=t
    print("swap:"+str(a)+","+str(b))
m=10;n=20
swap(m,n)
print(m,n)
swap函数有两个参数a和b,它的功能是把a和b的值互换,main函数调用swap,swap在最后打印和a和b的值,swap调用完后再打印一下a和b的值,看换了没有。然而运行结果是:
我们可以看到在swap内部的打印,参数a和b的值是换了的,然而在swap函数调用后再打印(第8行),m和n的值并没有换。 到底发生了什么?
这是因为m和n的值传入swap的时候,是复制了一个值然后分别赋值给参数a和b,然后对a和b的操作,实际上不会影响到本尊m和n。就好像你复制了一个文件给你朋友,他改了文件对你的原文件一点影响都没有。这就是值传递。传进去的只是一个副本
如果要实现swap函数,那只能使用返回值的方式:
def swap(a,b):
    t=a;a=b;b=t
    print("swap:"+str(a)+","+str(b))
    return a,b
m=10;n=20
i,j=swap(m,n)
print(m,n)
print(i,j)

运行后可以看到m和n作为参数传入,它们的值在函数调用完后是没有变化的。

有没有办法让参数不使用副本呢?因为python没有办法指定引用传递还是值传递(C/C++可以)。对于python来说,swap这个函数是无法实现的。 基本变量类型例如整数、小数、字符这类参数都是值传递的,无法改变。
和值传递对应的是引用传递 ,对于不是基本变量类型的参数,例如数列,就不是值传递了。这类参数函数是直接操作参数,并不是副本!我们看看这个例子。
def change(list):
    list[0]=5
arr=[6,7]
change(arr)
print(arr)
list是一个列表,有两个元素,值是[6,7],而函数change接受一个数组参数,它修改了参数第一个元素的值为5。我们调用了change,然后打印array第一个元素,打印的结果是5。说明这个种情况下,函数对参数的修改生效了
总结起来就是两句话:
1.基本变量类型(整数、小数、字符、布尔)作为函数的参数,采用的是值传递,是复制一个副本,函数对参数的修改影响不了原来的变量。
2.集合类型(列表、元组、集合、字典)作为参数,采用的是引用传递,函数可以修改这类参数的值。