参数传递
在python赋值、浅拷贝、深拷贝这篇文章中,我们知道了python中变量就是对象的引用(别名)。那么当函数进行传参操作时,函数内的形参与实参是什么关系?
python采用的参数传递方式是共享传参,参数的各个形式参数获得的是实参中各个引用的副本,也就说形参是实参的别名,参数传递传的还是引用。
这种传引用的方式在传不可变对象时没啥问题,但如果传递的是可变对象,就有可能改变实参的值(和可变对象的赋值操作类似)。
看例子:
def f(a, b):
a += b
return a
x, y = 1, 2
print(f(x, y), x, y)
c, d = [1, 2], [3, 4]
print(f(c, d), c, d)
e, g = (1, 2), (3, 4)
print(f(e, g), e, g)
运行结果:
3 1 2
[1, 2, 3, 4] [1, 2, 3, 4] [3, 4]
(1, 2, 3, 4) (1, 2) (3, 4)
运行程序后,传递的参数为int和tuple时,形参改变,实参没有改变,但传递的参数是list时,改变形参的值,实参的值也发生了变化。
可选参数默认值
python函数传参时还允许我们设置函数的可选参数,并为其设置默认值,形如def f(a, b=0),调用函数f时,如果传递两个参数,那么a和b就是对应的传递过来的值,如果只有一个参数,那么就将其赋给a,b的值就是默认的0。一般我们将可选参数的默认值设置为Noneÿ