传递list对象作为参数_一文搞懂参数传递原理

本文详细解析了Java、Go、Python三种语言中参数传递的原理,包括基本类型和引用类型的区别。Java采用值传递,无论是基本类型还是引用类型,传递的都是值的副本。Go语言虽然有指针概念,但也遵循值传递原则。Python中,不可变类型按值传递,可变类型则表现为类似引用传递的效果,但实际上是内存地址的拷贝。
摘要由CSDN通过智能技术生成
00df4e7148cba213ec483ceff3d4fd1d.png

前言

最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go ,期间为了快速实现需求只是依葫芦画瓢的撸代码;并没有深究一些细节与原理。

就拿参数传递一事来说各个语言的实现细节各不相同,但又有类似之处;在许多新手入门时容易搞不清楚,导致犯一些低级错误。

Java

基本类型传递

先拿我最熟悉的 Java 来说,我相信应该没人会写这样的代码:

@Test    public void testBasic() {        int a = 10;        modifyBasic(a);        System.out.println(String.format("最终结果 main a==%s", a));    }    private void modifyBasic(int aa) {        System.out.println(String.format("修改之前 aa==%s", aa));        aa = 20;        System.out.println(String.format("修改之后 aa==%s", aa));    }

输出结果:

修改之前 aa==10修改之后 aa==20最终结果 main a==10

不过从这段代码的目的来看应该是想要修改 a 的值,从直觉上来说如果修改成功也是能理解的。

至于结果与预期不符合的根本原因是理解错了参数的值传递与引用传递。

在这之前还是先明确下值传递与引用传递的区别:

97520311bf8bcf9c66ffc59672f46575.png

这里咱们先抛出结论, Java 采用的是值传递;这样也能解释为什么上文的例子没有成功修改原始数据。

参考下图更好理解:

88107206258eec6aba3c487337a821a4.png

当发生函数调用的时候 a 将自己传入到 modifyBasic 方法中,同时将自己的值复制了一份并赋值给了一个新变量 aa 从图中可以看出这是 a 和 aa 两个变量没有一毛钱关系,所以对 aa 的修改并不会影响到 a 。

有点类似于我把苹果给了老婆,她把苹果削好了;但我手里这颗并没有变化,因为她只是从餐盘里拿了一颗一模一样的苹果削好了。

如果我想要她那颗,只能让她把削好的苹果给我;也就类似于使用方法的返回值。

a = modifyBasic(a);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值