加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python函数中参数的传递

发布时间:2020-12-20 10:17:09 所属栏目:Python 来源:网络整理
导读:?Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形

?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,d))
 6 ... 
 7 >>> num=1
 8 >>> l=[1,1,1]
 9 >>> d={nice:111}
10 >>> print("before:",d))
11 before: num=1.000000,l=[1,1],d={nice: 111}
12 >>> fun(num,d)
13 inside: num=123.000000,3],d={a: 123}
14 >>> print("after:",d))
15 after: num=1.000000,d={nice: 111
需要说明的是:函数内部的num,l,d和命令行里的num,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,d1))
 6 ... 
 7 >>> num=111c
 8 >>> l=[1,1]
 9 >>> d={a:111,b:0}
10 >>> print("before:",d))
11 before: num=111.000000,d={a: 111,b: 0}
12 >>> fun2(num,d)
13 inside: num1=123.000000,l1=[123,d1={a: 123,b: 0}
14 >>> print("after:",d))
15 after: num=111.000000,l=[123,d={a: 123,b: 0}

?

小结:python中一切皆对象,函数中传递的是对象的引用,当形参指向了不同对象,实参不会改变;当形参通过传递来的引用修改了对象的内容,实参会跟着改变,因为形参和实参指向的是同一个对象。其中不仅是函数参数的传递是这样,在函数内部也是这样。当一个变量向另一个变量赋值时,给的是对象的引用,这个对象的引用,感觉相当于c语言中变量的地址,只是在python中,这个地址变量是通用的,可以指向任意类型,当你改变了这个地址,相当与python中指向了不同对象,原来变量的地址没有改变,所以原来变量指向的地址的内容没有改变。当你通过这个地址改变了地址里面的内容时,原来变量指向的地址的内容也会跟着改变。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读