详解python 函数传值方法

  • Post category:Python

Python 中的参数传递方式有两种:传值(Call by Value)和传引用(Call by Reference)。

传值方式

在传值方式中,函数的形参接收实参的值,即将实参的值复制一份给形参。这意味着如果将形参的值更改为其他值,原始实参的值不会改变,因为传递的是副本。

举个例子,假设有如下代码:

def change_num(num):
    num = 10
    print("内部函数中的num值为:", num)

n = 20
change_num(n)
print("外部函数中的n值为:", n)

输出:

内部函数中的num值为: 10
外部函数中的n值为: 20

可以看到,在函数体内部,修改了形参num的值,但是原始实参n并未受到影响。

传引用方式

在传引用方式中,函数的形参接收实参的引用,即实参的地址。这意味着如果修改形参的值,原始实参的值也将相应更改。

举个例子,假设有如下代码:

def change_list(arr):
    arr.append(4)
    print("内部函数中的列表为:", arr)

lst = [1, 2, 3]
change_list(lst)
print("外部函数中的列表为:", lst)

输出:

内部函数中的列表为: [1, 2, 3, 4]
外部函数中的列表为: [1, 2, 3, 4]

可以看到,在函数体内部,向形参arr增加元素4,原始实参lst也跟着增加了。

总结

Python 中的参数传递方式取决于传递的对象类型。对于不可变对象(如字符串、数字、元组等),使用传值方式;对于可变对象(如列表、字典等),使用传引用方式。

不过需要注意的是,在函数内部如果重新给可变对象赋一个新值,原始实参不会受到影响,因为重新赋值会改变对象的指向。

举个例子,假设有如下代码:

def change_list(arr):
    arr = [1, 2, 3]
    print("内部函数中的列表为:", arr)

lst = [1, 2, 3]
change_list(lst)
print("外部函数中的列表为:", lst)

输出:

内部函数中的列表为: [1, 2, 3]
外部函数中的列表为: [1, 2, 3]

可以看到,在函数内部重新给arr赋值,但是外部原始实参lst的值没有改变。