Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形参是实参的别名(alias)这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换为另一个对象.
1 >>> def fun(num,l,d):
2 ... num=123;
3 ... l=[1,2,3]
4 ... d={'a':123}
5 ... print("inside:","num=%f,l=%s,d=%s"%(num,l,d))
6 ...
7 >>> num=1
8 >>> l=[1,1,1]
9 >>> d={'nice':111}
10 >>> print("before:","num=%f,l=%s,d=%s"%(num,l,d))
11 before: num=1.000000,l=[1, 1, 1],d={'nice': 111}
12 >>> fun(num,l,d)
13 inside: num=123.000000,l=[1, 2, 3],d={'a': 123}
14 >>> print("after:","num=%f,l=%s,d=%s"%(num,l,d))
15 after: num=1.000000,l=[1, 1, 1],d={'nice': 111
需要说明的是:函数内部的num,l,d和命令行里的num,l,d是不同的变量,只是名字相同。函数内部的是形参,命令行里的是实参。
修改传递进来对象的内容,即不是让形参指向不同对象,而是通过引用修改对象内容。当然这个对象必须是可变的。
知识兔1 >>> def fun2(num1,l1,d1): 2 ... num1=123 3 ... l1[0]=123 4 ... d1['a']=123 5 ... print("inside:","num1=%f,l1=%s,d1=%s"%(num1,l1,d1)) 6 ... 7 >>> num=111c 8 >>> l=[1,1,1] 9 >>> d={'a':111,'b':0}10 >>> print("before:","num=%f,l=%s,d=%s"%(num,l,d))11 before: num=111.000000,l=[1, 1, 1],d={'a': 111, 'b': 0}12 >>> fun2(num,l,d)13 inside: num1=123.000000,l1=[123, 1, 1],d1={'a': 123, 'b': 0}14 >>> print("after:","num=%f,l=%s,d=%s"%(num,l,d))15 after: num=111.000000,l=[123, 1, 1],d={'a': 123, 'b': 0}