请看上节课的函数代码:
def checkAndPrint(p_q, pq, sym, p, q):
......
小括号里的就是函数的形式参数——该参数名称只能在函数体内可见,参数是默认类型——按位传值。按位:调用函数时,需要按顺序输入同样多个的参数;传值:每个参数都拷贝一份放在形式参数中。例,p_q是一次项系数的形式参数,当程序用一次项系数p_plus_q调用时,p_plus_q一定要放第一位,程序会把p_plus_q的值复制一份,放在内存不同的地方,然后用p_q来标注它。
形式参数一般只用于传递数值,但不是不能修改。如果修改了形式参数的值,原来的参数的值会不会改变呢?
请看代码和运行结果:
可见,函数体内修改形式参数,不影响原参数值。
上面传入的是全局变量,如果是局部变量会怎样呢?
请看代码和运行结果:
可见,局部变量也一样。
上面例子的参数是单值,如果用列表或字典这些结构类型的变量调用函数,函数体内能否改变列表或字典里的元素呢?
请看代码和运行结果:
可见,函数体内是可以修改传入列表的元素值的。
上面传入的列表是全局变量,如果是局部变量会怎样呢?
请看代码和运行结果:
可见,局部变量的列表也一样。
练习:参照上面的步骤和代码,测试字典按位传值调用,看看函数体内是否能修改字典内的元素。
为什么调用参数是列表或字典,在函数体内可以修改元素值呢?
原来,列表或字典等这些复合数据,它的辨识(我们习惯称作变量)的值是内存地址(一般我们叫做指针)。当用它用传值形式调用函数时,系统会负责这个变量的值到形式参数中。因为这个值本来就是指针,所以原变量和形式变量都指向同一个内存地址,在函数体内修改元素值就是修改了原来那个复合数据的元素值。
在按位传值调用函数时,如果输入的参数个数于函数的形式参数的个数不一致会怎样呢?
请看代码和运行结果:
可见,参数是不能少的。能不能多呢?
请看代码和运行结果:
可见,参数是不能多的。
形式参数名称与全局变量名称相同,会怎样的情况呢?
请看代码和运行结果:
可见:
(1)形式参数与全局变量同名,函数体内的该参数初值是入口值,函数体内修改这个形式参数的值也不影响全局变量的值。两个变量虽然同名,实际上毫无关系。
(2)对比测试函数不能运行,原因是局部变量"aCompVar"使用时还没有赋值(定义),从这个情况可知,在函数体内,全局变量是不可见的。
因此,函数形式参数的取名再也不用担心与全局变量名称相同;函数体内也不用担心由于局部变量名称与全局变量相同而使用全局变量。
那么,要在函数体内使用全局变量怎么办?
请看代码和运行结果:
可见,在函数体内,如果要使用全局变量,在使用前用“global”关键字对变量名称进行修饰一下(本例:global aGlobalVar)。
如果不先用global修饰,直接赋值会怎样呢?
请看代码和运行结果:
可见,如果直接赋值,该名称就成了局部变量,与同名的全局变量没有关系了。也就是说,Python程序员不用担心函数体内局部变量与全局变量的名称相同。
如果要在函数体内使用全局变量,但先要修改全局变量的值,在赋值语句前加global修饰能否可以呢?
请看代码和运行结果:
语法错误!正确方法和运行结果如下:
练习:把这节课所有的测试,自己做一遍。