C/C++中,传递参数的类型是可以指定的。一般来说,传递参数可以分为两种:值传递和引用传递。对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量;对于引用传递,函数中的对象与传入的对象其实是同一个对象,也就是说,参数仅仅是原对象的一个引用。一般来说,C/C++默认的方式都是值传递,要改变原对象,可采用显式的引用或者指针传递的方式。
那么,在Python中呢?Python语言中显然没有能指定传递类型的语法,毕竟是一门动态的解释型语言,也没有显式的类型要求。
下面验证Python函数参数传递的方式:
def changelist(lst): #修改列表 lst[0] = '1' lst = [111, 2, 3, 4] changelist(lst) print lst def changedict(dic): #修改字典 dic["lustar"] ="yes" dict1 = {"lustar": "no"} changedict(dict1) print dict1
输出结果为:
['1', 2, 3, 4] {'lustar': 'yes'}
可见,对于列表和字典,参数传递的方式是引用传递。
def changestring(string1): #修改字符串 string1 += "None" str1 = "I am a good boy!" changestring(str1) print str1 def changevar(a): #修改变量 a += 111 b = 1 changevar(b) print b
输出结果为:
I am a good boy!
1
可见,对于字符串以及一般的变量,结果类似于值传递,并不会影响到原结果。那么,如果想改变字符串的值呢?返回新的字符串即可:
def changestring(string1): string1 += "None" return string1 #修改后的参数作为返回值 str1 = "I am a good boy!" print id(str1) str1 = changestring(str1) print str1 print id(str1)
输出结果为:
31869336
I am a good boy!None
31867712
可见,这时的字符串已经不是在原来的基础上修改了,实际上是返回了一个新字符串。
结论:
对于可以修改的对象,如列表和字典,函数的参数传递方式是引用传递。
对于不能修改的对象,包括字符串、一般变量和元组(元组本来就不能修改),参数传递的方式是值传递。如果确实需要修改该对象的值,可以利用函数的返回值进行修改。