亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

探秘Python里的函數參數傳遞方式

標簽:
Python

经常用python函数的同学们可能会有一个疑问,Python的函数的入参到底是传值呢还是引用,其实说实话,这个问题在我刚开始学python的时候也纠结过,因为对于 c/c++,里面函数参数传递是有传地址也有传值的。所以在python里面到底又是怎么样.

其实这个问题很有意思,把这个问题弄明白之后,对python的理解又前进了一步.



开始之前我们先说一下什么是传值,什么是传引用

传值

简单来说,你在内存中有一个地址,我也有一个地址,我呢把我的地址里面的内容复制给你,以后你做什么就跟我没有啥关系咱俩井水不犯河水。不会改变原来的参数的内容

传引用

所谓传引用是有一个参数在内存有个地址,地址里面放了一堆东西,在调用函数时,把实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。也就是说最后函数运行完之后会改变原来的参数的内容.

好下面我们来说一说Python里面是怎么做的,希望能给初学者一些启示:

1.先看一个简单的例子

例1:传引用

https://img1.sycdn.imooc.com//5d58ee4c0001889b08420401.png

如果是传引用,也就是说最后会改变原来的参数,那么n的值在函数内修改了变成了11,那么n最后应该是11啊,但是n还是10,没有变化,看来python不是传引用,那哎哎哎,是不是传值呢,好我们接着往下探.

2.再看一个小例子

例2:传值

https://img1.sycdn.imooc.com//5d58ee4e000147fa08320482.png

若是传值,old原来是['a','b','c']那么运行完change()函数之后,应该还是['a','b','c'],显然最后old的内容改变了。

那么python中的参数传递也不是传值,问题来了不是传引用也不是传值,到底是传啥呢~~


3.深入探究

a=1,b=a,b=2

这个在C/C++里面执行b=a的时候,其实是在内存里面申请一块内存把a的值复制到内存中,当执行b=2的时候,是把b对应的值从1修改成2,如图:

https://img1.sycdn.imooc.com//5d58ee520001eaa806530306.png

但是在Python里面的赋值并不是复制,b=a的操作使得b与a引用同一个对象(注意是对象),而b=2则是b指向2,如图:

https://img1.sycdn.imooc.com//5d58ee570001206905690317.png

不信我们可以在程序里面验证:

a=1

print(id(a))

>>>33989408

b=a

print(id(b))#b=a之后b的id()值和a一样

>>>33989408

b=2

print(id(b))

>>>33989396#b=2之后b指向对象2,id()值发生了改变

print(id(a))

>>>33989408

从程序里面写可以看出

b=a赋值后b的id()和a一样,b=2之后b指向了另外一块空间,其实b=a传递的是对象的引用,它们指向同一块内存.

当b=2之后b又重新指向了2所代表的对象上去,而此时1只有a指向.

4.揭开谜底

说了一大圈是时候揭开底牌了.对于例1,n=n+1,因为n是数字,是不可变的对象,n+1会重新申请一块新的内存,其值为n+1,并在函数体中创建局部变量n指向它。当函数add()调用完之后,函数体中的局部变量在函数体外不可见,此时的n代表函数体外的命名空间所对应的n,所以其值还是10.

结论:Python函数参数传递的是对象的引用,参数传递的过程中将整个对象传入.

对于可变的对象的修改在函数外部和内部都可见,调用者和被调用者共享这个对象

而对于不可变对象,由于并不能真正被修改,因为修改一般都是通过生成一个新的对象然后赋值来实现的。

(好谜底揭开了,刚才我特意没有解释例2,现在你试着去理解看看,是不是能明白.)

https://mp.weixin.qq.com/s?__biz=MzIxNjM4NDE2MA==&mid=2247483750&idx=1&sn=419ca491316489662bbe9488f0a72b24&scene=19&pass_ticket=5IX5w2VzSfzlWn9Km2wqD7zqYp4jYO%2BYDWcORknsQl0X3GTgh0B28BkiPNrVXPyA

最后说一下,我坚持原创,若我写的对大家有帮助,麻烦大家支持一下,也是对我的一点鼓励和动力。

谢谢


作者:菜鸟学python
链接:https://www.jianshu.com/p/fe0102ff46b4


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消