欢迎访问宙启技术站
智能推送

Python函数的参数传递方式及比较

发布时间:2023-07-03 21:42:52

Python中的函数参数传递方式有两种:按值传递(call by value)和按引用传递(call by reference),可以通过比较来看出它们的不同之处。

按值传递是指将实际参数的值复制一份传递给形式参数,在函数内部对形式参数的任何修改都不会影响到实际参数的值。这种方式适用于不可变对象,如数值、字符串、元组等。下面是一个示例:

def func(x):
    x = 10
    print(x)

a = 5
func(a)
print(a)

运行结果是:

10
5

可以看出,函数内部将形式参数x的值修改为10,并没有影响到实际参数a的值。

按引用传递是指将实际参数的引用(内存地址)传递给形式参数,两者指向同一块内存地址,因此在函数内部对形式参数的修改会影响到实际参数的值。这种方式适用于可变对象,如列表、字典等。下面是一个示例:

def func(lst):
    lst.append(4)
    print(lst)

a = [1, 2, 3]
func(a)
print(a)

运行结果是:

[1, 2, 3, 4]
[1, 2, 3, 4]

可以看出,函数内部通过引用修改了形式参数lst的值,同时也修改了实际参数a的值。

需要注意的是,Python中没有显式的按引用传递机制,而是将可变对象传递给函数时,其实是将对象的引用传递给形式参数。因此,对于不可变对象,即使函数内部修改了形式参数的值,也不会影响实际参数的值。

除了按值传递和按引用传递之外,在Python中还有一种特殊的传递方式,即使用*args和**kwargs参数来接收可变数量的位置参数和关键字参数。这种方式可以在函数定义时不确定参数的个数。下面是一个示例:

def func(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, value)

func(1, 2, 3, name='Tom', age=20)

运行结果是:

1
2
3
name Tom
age 20

可以看出,在函数定义中使用了*args和**kwargs参数,它们会接收所有的位置参数和关键字参数,并将它们作为一个元组和字典传递给函数。在函数内部可以使用for循环来遍历并打印这些参数。

通过以上比较,可以得出以下结论:

1. Python函数的参数传递方式取决于参数的类型,对于不可变对象使用按值传递,对于可变对象使用按引用传递。

2. 对于不确定参数个数的情况,可以使用*args和**kwargs参数接收可变数量的位置参数和关键字参数。