参数传递的方式 | Python从入门到精通:高阶篇之三
实参的类型
创建函数
def fn2(a):
print('a =',a)
fn2(123)
执行结果:
def fn2(a):
print('a =',a)
#b=123
a= 123
#fn2(b)
fn(a)
执行结果:
其中形参的a跟函数外面的a,并没有关系,并不会被覆盖掉,之后我们会有详细的解释。
函数在调用时,解析器不会检查实参的类型,实参可以传递任意类型的对象。
def fn2(a):
print('a =',a)
b = True
b = 'hello'
b = None
b = [1,2,3]
#fn2(b)
fn2(fn)
执行结果:
我们可以去调用这个函数。
def fn2(a):
print('a =',a)
a(1,2,3)
fn2(fn)
执行结果:
可以发现,fn是之前定义的一个函数,我们执行fn2(fn),并不是调用fn2(fn()),所以执行的结果是a是一个函数。所以实参可以传递任意类型的对象,数字、布尔值、字符串、列表、函数等都可以。
但是这其中也会有一些问题。
def fn3(a , b):
print(a+b)
#fn3(123,456)
fn3(123,"456")
执行结果:
我们可以得出,不支持int与str相加的操作,会导致程序出错,所以我们在传递参数的时候需要注意参数的类型。当然之后我们会有异常的检查,但当下我们需要注意在定义函数的时候需要尽量去将函数设置完整,检查类型,在传递参数的时候明确所要传递的类型的实参。
定义一个函数fn4
在每一个函数参数都是独立的,每个形参都只是在其本身的函数是有作用的。所以不同函数之间相同的形参并不影响。
def fn4(a):
print('a =',a)
c = 10
fn4(c)
print('c =',c)
执行结果:
在函数之外打印出的结果与函数输出的结果一致,现在针对于函数中的a重新赋值。
def fn4(a):
a = 20
print('a =',a)
c = 10
fn4(c)
print('c =',c)
执行结果:
在函数中对形参进行重新赋值,不会影响其他的变量。
针对上面的函数再次做出修改:
def fn4(a):
# a = 20
# a是一个列表,尝试修改列表中的元素,此时所改的是对象
# 如果形参指向的是一个对象,当我们通过形参去修改对象时
# 会影响到所有指向该对象的变量
a[0] = 30
print('a =',a)
c = 10
c = [1,2,3]
fn4(c)
print('c =',c)
执行结果:
我们可以通过id去判断:可以发现id是一样的。
def fn4(a):
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
fn4(c)
print('c =',c,id(c))
执行结果:
所以我们修改的时候需要注意所修改的是变量还是对象,避免对程序造成影响。
如果想要a与c是相互独立的,一个改变对另外一个没有影响,我们可以通过浅复制来解决,传递c的副本。
def fn4(a):
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
#fn4(c)
fn4(c.copy())
print('c =',c,id(c))
执行结果:
当然,也可以有别的解决方式,通过切片来解决。
def fn4(a):
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
#fn4(c)
#fn4(c.copy())
fn4(c[:])
print('c =',c,id(c))
执行结果:
配套视频课程,点击这里查看
获取更多资源请订阅Python学习站