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

Python函数的参数传递方式

发布时间:2023-12-03 03:30:45

Python函数的参数传递方式有两种:传值和传引用。

传值(call by value)是指在函数调用时,将实际参数的值复制给形式参数,形式参数和实际参数是两个独立的变量,它们在内存中存储的是不同的值。这意味着在函数内部修改形参的值不会影响到实参。示例如下:

def change_value(num):
    num = 10

a = 5
change_value(a)
print(a)  # 输出 5

在上述例子中,函数change_value接收一个参数num,将其值改变为10。在函数调用过程中,实参a的值被复制给了形参num,然后在函数内部对num的值进行修改。但是在函数调用结束后,a的值仍然是5,没有被修改。

传引用(call by reference)是指在函数调用时,将实际参数的引用传递给形式参数。形式参数和实际参数指向同一个内存地址,它们共享同一个值。这意味着在函数内部对形参的修改会影响到实参。示例如下:

def change_list(lst):
    lst.append(4)

my_list = [1, 2, 3]
change_list(my_list)
print(my_list)  # 输出 [1, 2, 3, 4]

在上述例子中,函数change_list接收一个参数lst,对lst进行修改,向其末尾添加一个元素4。在函数调用过程中,实参my_list的引用被传递给了形参lst,它们指向同一个内存地址。所以在函数内部对lst的修改同样会影响到实参my_list,导致my_list的值发生了变化。

需要注意的是,Python函数的参数传递方式是根据对象的类型来决定的。对于不可变类型(如数值、字符串、元组)来说,参数传递是传值的方式;而对于可变类型(如列表、字典、集合)来说,参数传递是传引用的方式。这是由于不可变类型的值是不能被修改的,而可变类型的值是可以被修改的。

此外,还可以通过使用参数的默认值来改变参数传递的方式。当给参数设置默认值时,会创建一个新的对象。如果在函数调用时没有给参数传递值,就会使用默认值,而不会改变原来的对象。示例如下:

def add_value(num, lst=[]):
    lst.append(num)
    return lst

print(add_value(1))  # 输出 [1]
print(add_value(2))  # 输出 [1, 2]

在上述例子中,函数add_value接收一个参数num和一个参数lst,并给参数lst设置了默认值。在第一次调用函数时,参数lst使用了默认值[],并且将num添加到lst中。在第二次调用函数时,由于参数lst的默认值是在函数定义时创建的,所以第一次调用时lst已经被修改了。所以第二次调用函数时,lst的值是[1],并将num添加到lst中。这就是参数默认值会产生的副作用,所以在使用默认值时需要特别小心。