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