python函数之参数传递

       最近刚入手Python,在写函数的时候已经陷入了很大的坑,发现Python函数在参数传递的时候跟Java、C、以及C++还是有点不一样的,在这梳理总结一下,以纪念那些年我曾经踩过的坑。

       还是先上个例子吧,之前师姐问过我这样一个问题,自己翻了很多书籍,查了很多资料,发现讲的都比较模糊,反而把我自己绕进去了,也没给师姐弄明白,最后把自己给搞死了:

为什么会这样呢?这里我们还是从函数的参数传递开始说吧。首先我们要接受这样一个事实:在Python里面,所有参数都是按引用传递的。通过下面这个例子可以看出来:


通过结果我们可以看到,无论是基本数据类型,还是说list这样的可变对象,在进行函数的参数传递时都是按引用传递的,因为调用id()函数后得到的值是一样的。

因此,到这一步,牢记:在Python中所有参数在Python里都是按引用传递

接下来,我们需要了解一下Python里面的不可变对象(比如字符串)和可变对象(比如列表list)的概念。因此参数传递的时候这两种情况要非别进行考虑:

1. 对于不可变对象作为函数参数,类似于C++的值传递

2. 对于可变对象作为函数参数,相当于C++的引用传递


如图所示的两个结果,分别对不可变对象和可变对象进行了测试,我们可以看到,对于不可变对象的参数传递,其实跟C++中的值传递是一样的,对于形参的修改,并不会影响实参的值。而对于可变对象的参数传递,和C++中的引用传递是一样的,形参变了,实参的值也会发生变化。

也许到了这里你会问:第一张图片中的第一个例子函数参数传递的是可变对象list,但是输出结果同样是没有改变呀?这里就要介绍第三种情况了:对于可变对象作为函数参数,且参数不指向其他对象时,相当于C++的引用传递;否则,若参数指向其他对象,则对参数变量的操作并不会影响原变量的对象值。


参数nums指向了新的对象[0,0],而原变量d的值仍为[1,2,3],因为nums指向了与d不同的内存变量,所以对参数变量nums的操作并不影响原变量d的值。

可以用如下所示的图来理解这个过程:


我们看到,对象的指向已经发生改变,故对原变量并没有影响。变量是对内存空间的引用,当参数变量和原变量指向不同的内存空间时,操作互不影响。

最后,总结为以下三点:

  • 对于不可变变量作为函数参数,相当于C++的按值传递
  • 对于可变对象作为函数参数,并且当参数不指向其它对象时,相当于C++语言的引用传递
  • 对于可变对象作为函数参数,且参数指向了其它对象,对参数变量的操作不影响原变量的值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值