Python 参数传递
本文将从以下几个方面对Python 参数传递做详细阐述:
一、参数传递的基础概念
Python 学习中,参数传递是一个必须掌握的重要概念。简单来说,参数传递是指在函数调用时将实际参数传递给形式参数的过程。
# 定义一个简单的函数,并传递参数 def greeting(name): print('Hello, ' + name + '!') greeting('Tom')
在上面的例子中,我们定义了一个函数greeting,它接受一个参数name,并打印出"Hello, name!" 的结果。在函数调用时,我们传递了参数Tom,实际参数通过形式参数name传递到函数中。
二、Python 中参数传递的方式
Python 中存在两种参数传递的方式:传值和传引用。在 Python 中,对象分为可变对象和不可变对象,可变对象包含列表、字典等,不可变对象包含数字、字符串等。
1、传值
在 Python 中,传值就是将实际参数的值传递给形式参数的过程。对于不可变的数据类型,如数字、字符串、元组等,参数传递的方式是传值。这也就是说,在函数内对形参所做的修改,不会影响到函数外部的实参。
# 传递字符串作为参数的示例 def change_string(str): str = 'Changed String' print('函数内值: ', str) string = 'Hello, world!' change_string(string) print('函数外值: ', string)
在上面的代码中,我们定义一个函数change_string,它接受一个字符串类型的参数str,并在函数内部对str变量赋值。当我们调用函数change_string函数时,函数内部的str被赋值为'Changed String'。但是,函数外部的string仍然保留着原先的值'Hello, world!',这说明传递的是参数的值,形参的修改并不会影响到实参。
2、传引用
在 Python 中,传引用就是将实际参数的引用传递给形式参数的过程。对于可变的数据类型,如列表、字典等,参数传递的方式是传引用。这就意味着如果在函数内修改了形参,实参也会受到影响。
# 传递列表作为参数的示例 def change_list(mylist): mylist.append([1,2,3,4]) print('函数内值: ', mylist) list = [10,20,30] change_list(list) print('函数外值: ', list)
在上面的代码中,我们定义一个函数change_list,它接受一个列表类型的参数mylist,并在函数内部对mylist执行了append操作。当我们调用函数change_list函数时,函数内部的mylist向原始列表中添加了一个包含4个数字的新列表。但是,函数外部的list也被修改了,它现在包含了4个元素:[10,20,30,[1,2,3,4]],这说明传递的是变量的引用,形参的修改会影响实参。
三、默认参数
在 Python 中,函数可以接受默认值作为参数,这些默认值可以是必需的或可选的。定义默认值后,函数参数可以在调用时不用传递任何值。
# 带有默认值的函数示例 def print_info(name, age=35): print('Name: ', name) print('Age: ', age) print_info('Tom') print_info('Jerry', 40)
在上面的代码中,我们定义了一个函数print_info,它包含两个参数:name和age。age参数具有默认值35,这意味着可以省略age参数的传递。在函数的第一次调用中,只传递了一个参数name,没有传递age参数,这时函数会使用默认值35。在第二次调用时,传递了两个参数,分别是name和age,这时函数使用传递的参数。
四、可变参数
在 Python 中,函数可以接受任意数量的参数,这些参数可以是位置参数、默认参数或关键字参数。使用可变参数,可以传递不同数量的参数,这对于编写灵活的函数非常有用。
1、位置参数
位置参数就是指不带任何额外符号或名称的参数。在函数中,可以使用*args来接受任意数量的位置参数。
# 使用位置参数的示例 def print_args(*args): print('传入的参数: ', args) print_args('a','b','c')
在上面的代码中,我们定义了一个函数print_args,它使用*args以实现接受任意数量的位置参数。当我们调用函数print_args时,*args收集传入的所有参数并将其打印出来。
2、关键字参数
关键字参数就是指使用关键字传递的参数。关键字参数允许在函数调用时指定函数参数的名称,这会使代码更具可读性。在函数中,可以使用**kwargs来接受任意数量的关键字参数。
# 使用关键字参数的示例 def print_kwargs(**kwargs): print('传入的关键字参数: ', kwargs) print_kwargs(a=1, b=2, c=3)
在上面的代码中,我们定义了一个函数print_kwargs,它使用**kwargs以实现接受任意数量的关键字参数。当我们调用函数print_kwargs时,**kwargs收集传入的所有关键字参数并将其打印出来。
3、混合参数
在函数中也可以混合使用位置参数、关键字参数和默认参数,但是位置参数必须在关键字参数的前面。
# 混合使用参数的示例 def print_people_info(name, age=35, *friends, **kwargs): print('Name: ', name) print('Age: ', age) print('Friends: ', friends) print('Other: ', kwargs) print_people_info('Tom', 25, 'Bob', 'John', location='New York', job='Engineer')
在上面的代码中,我们定义了一个函数print_people_info,它包含一个位置参数name、一个默认参数age、一个可变参数friends以及一个关键字参数**kwargs。当我们调用函数print_people_info时,前两个参数是位置参数,后两个参数分别是可变参数和关键字参数。可变参数会收集传入的位置参数,而关键字参数会收集传入的所有关键字参数。