一文搞懂Python的函数传参机制
函数是Python中的重要组件,而函数参数则是Python函数的基本组成部分之一。本文将深入讲解Python的函数传参机制,其中包括以下内容:
- 函数调用时参数的传递方式
- 函数参数的默认值
- 可变参数(args 和 *kwargs)
- 参数传递时的深拷贝与浅拷贝
函数调用时参数的传递方式
Python中的参数传递有两种方式,分别是值传递和引用传递。值传递是指,传递给函数的是对象的一个副本,而引用传递是指,传递给函数的是对象的一个引用。其中,大多数情况下采用的是引用传递的方式。
下面通过一个示例来说明:
def change(x):
x = 2
print("函数内 x 的值为:", x)
y = 1
print("函数调用前 y 的值为:", y)
change(y)
print("函数调用后 y 的值为:", y)
此函数接收一个参数 x,并将其值修改为 2,并在函数内打印出值。在主程序中定义了变量 y,并分别在函数调用前后打印其值。运行结果为:
函数调用前 y 的值为: 1
函数内 x 的值为: 2
函数调用后 y 的值为: 1
从结果可以看出,函数内部修改了 x 的值,但是 y 的值并没有改变。这说明,当函数调用时,会将 y 的值的一个副本传递给函数,而函数内修改的是这个副本的值,而不是 y 的值本身。
函数参数的默认值
Python中可以为函数参数设置默认值,这样当用户没有为这个参数传入值时,函数就会使用默认值。在定义函数时,可以在参数后面使用“=默认值”的形式指定默认值。示例如下:
def print_info(name, age=20):
print("姓名:", name)
print("年龄:", age)
print_info("小明") # 如果没有传入年龄参数,则默认使用20
运行结果为:
姓名: 小明
年龄: 20
可变参数(args 和 *kwargs)
当我们不确定函数会有多少个参数时,可以使用可变参数。Python中有两种形式的可变参数:
*args
:将多个无名参数打包成一个元组传入。**kwargs
:将多个关键字参数打包成一个字典传入。
示例如下:
def print_score(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print(key, ":", value)
print_score(1,2,3,语文=90,数学=80) # 输出1,2,3和语文:90和数学:80
深拷贝与浅拷贝
在Python中,当我们传递一个对象类型的变量时,实际上是将该变量的引用传递给了函数。如果在函数内部修改了该变量的值,那么实际上也就修改了原来的变量值,这就是浅拷贝。相比之下,深拷贝是指将变量的值完全复制一份,与原来的变量没有关系。
示例如下:
def change_list(mylist):
another_list = mylist
another_list[0] = 99
return another_list
lst = [1,2,3]
print(lst)
result = change_list(lst)
print(result)
print(lst)
这个示例定义了一个函数 change_list
,它接受一个列表类型的参数 mylist。在函数内部将mylist赋值一份给 another_list,并修改了 another_list 的第一个元素为99。在主函数中,先输出了 lst 的值,再调用 change_list 函数,将结果赋值给 result,并输出 lst 和 result 的值。运行结果如下:
[1, 2, 3]
[99, 2, 3]
[99, 2, 3]
从输出结果可以看出,函数内部修改了 another_list 的值,而这就相当于修改了 lst 的值,因为它们都是对同一数据的引用。这就是Python中的浅拷贝。
如果想使用深拷贝,则可以使用 copy 模块中的 deepcopy 函数,如下所示:
import copy
def change_list_deepcopy(mylist):
another_list = copy.deepcopy(mylist)
another_list[0] = 99
return another_list
lst2 = [1,2,3]
print(lst2)
result2 = change_list_deepcopy(lst2)
print(result2)
print(lst2)
该函数与之前示例中的函数类似,只不过在赋值操作中使用了 copy.deepcopy
函数进行深拷贝操作。运行结果如下:
[1, 2, 3]
[99, 2, 3]
[1, 2, 3]
从输出结果可以看出,函数内部修改了 another_list 的值,但是 lst 的值并没有被改变,这就是Python中的深拷贝。
至此,本文详细讲解了Python的函数传参机制,包括函数调用时参数的传递方式,函数参数的默认值,可变参数以及参数传递时的深拷贝与浅拷贝。希望能对Python学习者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Python的函数传参机制 - Python技术站