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

Python中函数的参数传递方式及其区别详解

发布时间:2023-07-06 06:54:17

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

值传递是指将实际参数的值复制一份给形式参数,在函数内部操作的是形式参数的副本,不会对实际参数产生影响。简单来说,就是将参数的值传递给函数,函数使用这个值进行运算,不会改变原来参数的值。

引用传递是指将实际参数的引用传递给形式参数,在函数内部操作的是实际参数的引用,会对实际参数产生影响。简单来说,就是将参数的引用传递给函数,函数使用这个引用进行运算,可能会改变原来参数的值。

不过实际上,在Python中,所有的参数传递都是引用传递。这是因为Python中的变量只是一个指向对象的引用,而不是真正存储数据的地方。当将一个变量作为参数传递给函数时,实际上是将这个变量的引用传递给了函数。

用一个例子来说明一下:

def change_value(x):
    x = 2
    print("In function: x =", x)

a = 1
print("Before function: a =", a)
change_value(a)
print("After function: a =", a)

输出结果为:

Before function: a = 1
In function: x = 2
After function: a = 1

可以看到,在函数内部修改了形式参数x的值,但是并没有改变原来实际参数a的值。

这是因为在函数内部,通过将实际参数a的引用传递给形式参数x,x和a指向了同一个对象。当在函数内部修改x的值时,实际上是修改了这个对象的值,而不是改变a的引用。

需要注意的是,虽然Python中的参数传递都是引用传递,但是对于不可变对象(比如整数、字符串、元组等),修改形式参数的值并不会改变实际参数的值。这是因为不可变对象在修改时会创建一个新的对象,而不是改变原来对象的值。只有对于可变对象(比如列表、字典等),修改形式参数的值才会对实际参数产生影响。

通过以下例子可以更好地理解这个概念:

def change_list(lst):
    lst.append(4)
    print("In function: lst =", lst)

my_list = [1, 2, 3]
print("Before function: my_list =", my_list)
change_list(my_list)
print("After function: my_list =", my_list)

输出结果为:

Before function: my_list = [1, 2, 3]
In function: lst = [1, 2, 3, 4]
After function: my_list = [1, 2, 3, 4]

可以看到,在函数内部修改了形式参数lst的值,实际上是在原有的列表上添加了一个元素。这种改变在函数外部也能够被观察到,说明形式参数lst和实际参数my_list指向了同一个列表对象。

综上所述,Python中所有的参数传递都是引用传递,对于可变对象的修改会改变实际参数的值,而对于不可变对象的修改并不会改变实际参数的值。