首页 > 编程笔记

Python参数传递(两种方式)

我们知道变量存储在系统的内存地址上,而地址上的数值和地址本身是独立与分开运作的,所以更改变量的数值是不会影响它存储的地址的。

而函数中的参数传递是将主程序中的变量值(实参)传递给函数部分的参数(形参),然后进行相应的处理。

本文我们学习 python 参数传递的使用方法。

Python参数传递

大部分程序设计语言有以下两种参数传递方式。

Python 的自变量传递是利用不可变和可变对象进行的,也就是说当所传递的实参是一种不可变对象(如数值、字符串)时,Python 会视为“传值”调用。

但是当所传递的实参是一种可变对象(如列表、字典)时,Python 会视为“传址”调用,这种情况下,如果函数内的可变对象被修改,因为占用同一地址,所以会同时影响函数外部实参的值。

以下程序范例说明在函数内部修改字符串的内容不会影响函数外部的值,不过在函数内部修改列表内容会改变函数外部的值。

【示例1】Python 的参数传递,代码如下:
def fun1(obj, price):
    obj = 'Microwave'
    print('函数内部修改字符串及列表数据')
    print('物品名称:', obj)
    #新增价格
    price.append(12000)
    print('物品售价:', price)

obj1 = 'TV'  #未调用函数时的字符串
price1 = [24000, 18000, 35600] #未调用函数时的列表
print('函数调用前默认的字符串及列表')
print('物品名称:', obj1)
print('物品售价:', price1)
fun1(obj1, price1)

print('函数内部被修改后的字符串及列表')
print('名字:', obj1) #字符串内容没变
print('分数:', price1) #列表内容已改变
输出结果:

函数调用前默认的字符串及列表
物品名称: TV
物品售价: [24000, 18000, 35600]
函数内部修改字符串及列表数据
物品名称: Microwave
物品售价: [24000, 18000, 35600, 12000]
函数内部被修改后的字符串及列表
名字: TV
分数: [24000, 18000, 35600, 12000]

Python位置参数与关键字参数

我们知道在调用函数时使用括号运算符“()”即可传入参数,但是参数传入的方式有位置参数与关键字参数两种方式,之前演示的函数调用方式采用的都是位置参数,特点是传入的参数个数与先后顺序必须和所定义函数的参数个数与先后顺序互相一致。

例如,函数有 3 个参数,调用函数时必须有一对一的实参与之配对。

如果想让参数不按照函数所定义的顺序传入,这种情况下就可以采用关键字参数。它能以让用户指定关键字的值的方式来传入实参值,在此以下面这个程序示例来加以说明。
def func(x,y,z):
    formula = x*x+y*y+z*z
    return formula

print(func(z=5,y=2,x=7))
print(func(7, 2, 5))
print(func(x=7, y=2 , z=5))
print(func(7, y=2 , z=5))
输出结果:

78
78
78
78

从执行结果可以看出:调用函数 4 次,虽然使用的都是不同的参数传递方式(位置参数、关键字参数与混合位置参数),但是其执行结果值都一致。

这里要特别注意:如果位置参数与关键字参数混用,必须确保位置参数在关键字参数之前,而且每个实参只能对应一个形参。下式就是一种错误的参数设定方式。

func(7, x=8 , z=5)

上式第一个实参传给参数 x,第二个实参又指定给参数 x,像这样重复指定相同参数的值就会发生错误,使用时要特别留意。

优秀文章