python函数中参数是如何传递的?

转载自http://www.cnblogs.com/zhaopengcheng/p/5492183.html
python中一切皆对象,函数中参数传递的是对象的引用。
1在函数中改变变量指向的对象,即指向不同对象。
当在函数中修改传递进来的变量指向另一个对象时,实参的对象不会改变。

复制代码

def fun(num,l,d):... num=123;... l=[1,2,3]... d={'a':123}... print("inside:","num=%f,l=%s,d=%s"%(num,l,d))... >>> num=1>>> l=[1,1,1]>>> d={'nice':111}>>> print("before:","num=%f,l=%s,d=%s"%(num,l,d))before: num=1.000000,l=[1, 1, 1],d={'nice': 111}>>> fun(num,l,d)inside: num=123.000000,l=[1, 2, 3],d={'a': 123}>>> print("after:","num=%f,l=%s,d=%s"%(num,l,d))after: num=1.000000,l=[1, 1, 1],d={'nice': 111}


复制代码

需要说明的是:函数内部的num,l,d和命令行里的num,l,d是不同的变量,只是名字相同。函数内部的是形参,命令行里的是实参。
2修改传递进来对象的内容,即不是让形参指向不同对象,而是通过引用修改对象内容。当然这个对象必须是可变的。


复制代码

def fun2(num1,l1,d1):... num1=123... l1[0]=123... d1['a']=123... print("inside:","num1=%f,l1=%s,d1=%s"%(num1,l1,d1))... >>> num=111>>> l=[1,1,1]>>> d={'a':111,'b':0}>>> print("before:","num=%f,l=%s,d=%s"%(num,l,d))before: num=111.000000,l=[1, 1, 1],d={'a': 111, 'b': 0}>>> fun2(num,l,d)inside: num1=123.000000,l1=[123, 1, 1],d1={'a': 123, 'b': 0}>>> print("after:","num=%f,l=%s,d=%s"%(num,l,d))after: num=111.000000,l=[123, 1, 1],d={'a': 123, 'b': 0}


复制代码

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,082评论 6 13
  • 周末的上午,阳光明媚,打开窗帘,空气里都是附近樱花的香味。 手机在茶几上震了一下,阳阳发来微信:“我在你家门口,赶...
    洛洛莉ya阅读 1,229评论 4 13
  • 晚饭后,我独自走在市镇广场。虽然已经是秋天,晚风却是闷热的。路过昏黄的路灯,身影逐渐被拉长,而后消失不见。突然感觉...
    重生之夏阅读 176评论 0 1
  • 通过阅读本文,可以让你快速了解数仓如何分层,合理,实用。笔者坚持原创,根据实践总结,希望对新手有所帮助。 分层案例...
    不务正业的coder阅读 16,970评论 5 68