值传递和引用传递

Java 、Go 和 Python 在函数传参时是值传递还是引用传递?

首先要分清楚值类型和引用类型

num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容

值传递和引用传递

Java:

java中方法参数传递方式是按值传递
如果参数是基本类型,传递的是基本类型的字面量值的拷贝
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝

Go:

Go默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量

Python:

Python参数传递统一使用的是引用传递方式。因为Python对象分为可变对象(list,dict,set等)和不可变对象(number,string,tuple等),当传递的参数是可变对象的引用时,因为可变对象的值可以修改,因此可以通过修改参数值而修改原对象,这类似于C语言中的引用传递;当传递的参数是不可变对象的引用时,虽然传递的是引用,参数变量和原变量都指向同一内存地址,但是不可变对象无法修改,所以参数的重新赋值不会影响原对象,这类似于C语言中的值传递。