一、基本概念
在Python中,传递参数指的是函数或方法中的参数传输方式。Python中的参数传递有两种方式,分别为“传值调用”和“传引用调用”。
所谓“传值调用”,是指在传参时,将原始变量的值复制一份传入函数中参与运算操作。传值调用不会改变原始变量的值,在函数内部改变参数的值,不会对原始变量造成影响。而所谓“传引用调用”,则是在传参时,将原始变量的引用地址传给函数,在函数内部改变参数的值,会对原始变量造成影响。
在Python中,函数和方法的参数传递默认采用“传值调用”方式。
二、传值调用
在Python中,传值调用又分为对不可变对象(如:数字、字符串、元组)和可变对象(如:列表、字典)进行传参,不同类型的对象传参方式也有所不同。
1、对不可变对象进行传参
不可变对象的值一旦赋值就无法改变,因此将其传递给函数时,只是将其值复制一份传递给函数。在函数内部对参数进行修改不会对原始变量造成影响。
def change_number(num):
num += 10
number = 10 # 定义一个变量
change_number(number) # 调用函数
print(number) # 输出结果为10
上述代码将数字类型的变量number传递给change_number()函数中,在函数内部对num进行加10操作,但是并不会对原始变量number造成影响。
2、对可变对象进行传参
而对于可变对象的传参,则与不可变对象不同,将其传递给函数时,传递的是原始对象的引用地址,即传递的是对象的指针,这意味着对其进行操作时会对原始变量造成影响。
def change_list(alist):
alist.append(4)
list1 = [1, 2, 3] # 定义一个列表
change_list(list1) # 调用函数
print(list1) # 输出结果为 [1, 2, 3, 4]
上述代码将列表类型的变量list1传递给change_list()函数中,函数在内部对list1进行了操作,结果会对原始变量造成影响,最终输出的结果为[1, 2, 3, 4]。
三、传引用调用
在Python中,使用特定的方式来实现传引用调用,通过使用import引入copy模块,在函数内部对参数进行修改时,不会对原始变量造成影响。
import copy
def change_dict(adict):
adict["name"] = "Tom"
dict1 = {"name":"Jack", "age":21} # 定义一个字典
dict2 = copy.copy(dict1) # 使用copy模块拷贝一个字典
change_dict(dict2) # 调用函数
print(dict1) # 输出结果为 {"name":"Jack", "age":21}
print(dict2) # 输出结果为 {"name":"Tom", "age":21}
上述代码引入了copy模块,并使用copy()函数对字典进行拷贝,将字典dict1拷贝给字典dict2。然后将字典dict2传递给change_dict()函数中,函数内对字典dict2进行了修改,但是原始字典dict1并没有受到影响,输出的结果也能够证明这点。
四、总结:
Python中,参数传递可以使用“传值调用”和“传引用调用”两种方式,对于不可变对象的传参,使用“传值调用”的方式,并且不会对原始变量造成影响;对于可变对象的传参,则使用“传引用调用”的方式,并且对原始变量造成影响。在Python中,如果需要在函数内部修改某个对象的值,可以在函数内部先使用copy()函数对其进行拷贝,这样就能够保证函数内部修改的对象不会对原始变量造成影响。