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

Python函数的参数传递:值传递和引用传递的区别是什么?

发布时间:2023-06-23 10:55:30

在Python中,函数的参数传递可以分为两种方式:值传递和引用传递。这两种方式有什么区别?

值传递

值传递就是将实参的值复制一份给形参,然后在函数内部进行操作,函数结束后,形参被销毁。这种方式是Python中最常用的一种参数传递方式。

我们通过一个示例来说明:

def foo(x):
    x = 3
    print("函数内部:x=", x)

a = 1
foo(a)
print("函数外部:a=", a)

输出结果为:

函数内部:x= 3
函数外部:a= 1

可以看到,在函数内部,我们改变了形参x的值,但是并没有影响到实参a的值。这就是值传递的特点:在函数内部改变形参的值,并不会影响到实参的值。

引用传递

引用传递就是将实参的引用(地址)传递给形参,在函数内部使用形参时实际上就是在操作实参的值。这种方式在Python中也是可行的,但是比较少用。

我们通过一个示例来说明:

def foo(lst):
    lst.append(4)
    print("函数内部:lst=", lst)

b = [1, 2, 3]
foo(b)
print("函数外部:b=", b)

输出结果为:

函数内部:lst= [1, 2, 3, 4]
函数外部:b= [1, 2, 3, 4]

可以看到,在函数内部,我们对形参lst进行了修改,但是它实际上也修改了外部的实参b。这就是引用传递的特点:在函数内部修改形参,会直接影响到外部的实参。

值传递和引用传递的选择

在Python中,值传递和引用传递都是可行的,但是在函数调用时需要根据实际情况选择何种方式。

如果函数内部只是需要使用实参的值,并不会对实参进行任何改变,那么就可以使用值传递。这种方式比较安全,因为不会对外部的实参产生任何影响。而且,由于Python中的赋值操作都是将对象的引用(地址)赋值给变量,所以在函数内部可能会修改实参的情况下,也可以使用值传递,只需要用一个新的变量名重新赋值,就不会对外部的实参产生影响。

如果函数内部需要修改实参的值,并且这个实参是一个可变的对象(如列表、字典等),那么就可以使用引用传递。这种方式可以减少内存占用,因为不需要在函数内部复制一份实参的值。但是需要注意的是,如果实参是不可变的对象(如数字、字符串、元组等),那么即使使用引用传递,也不会对实参进行改变,因为这些对象是不可变的。如果需要对这些对象进行修改,只能通过返回值的方式将修改后的结果返回给调用者。