Python中函数参数的传递方式是什么
创始人
2024-12-20 12:21:46
0次

  传值

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

  传引用

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

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

  1.先看一个简单的例子

  例1:传引用

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

  2.再看一个小例子

  例2:传值

  若是传值,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。

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

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

  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函数参数传递的是对象的引用,参数传递的过程中将整个对象传入。

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

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...