我之前总结过很多次java的参数传递问题,但是总觉得不够完美,今天再来总结一次,带上python
java的参数传递只有值传递,这是首先要声明的.
如果传递的参数是基本数据类型,那就是把本身的复制传了过去,不管在方法内部怎样修改这个值,都不会影响到方法外的变量。
如果传递的是一个对象,这是十分常见的,就是把这个对象的地址复制一份传递过去,这个时候所谓的值就是地址,这个时候就需要分类讨论了,对对象的常见的操作在某种意义上就分为两类,即"."和"=",
如果是".",那么是会影响到方法外的变量的,这是因为传递过来的是复制的一份地址,但复制的和原版的,指向的都是栈中的同一段地址,如果修改了,那么自然会影响到方法外的参数。
“=”就不一样了,直接对参数对象使用"=",那就是把这个参数名指向的地址换了一个,然后之后的操作都是对新地址的对象的操作,和方法外的原版变量没有一点关系,那么就不会影响到原版参数.
例子的话,大家可以自己试验一下,例如才方法内部修改String,因为String是一个不可变对象,那么所有对String的修改操作都相当于"=",还可以在方法内对数组内的某一个元素进行修改,这就相当于"."操作,
然后顺便说一下python,因为我经常把二者搞混,所以还是总结一下比较好.
python的话,在某种意义上和java还是很相似的,python的参数传递分为两种,
1:在大部分情况下,如果直接对整个变量进行重新复制,不管是可变的对象还是不可变的对象,在python中就是把引用指向另一个参数,那么对于函数外的变量没有影响,就相当于java中的"="
2:但是对于可变对象的某一个元素,如果进行修改,例如对列表中的某一元素进行重新赋值,那么对于实参就会产生影响,
这样看下来,python和java的参数传递还是很相似的,只是java中大部分变量都是对象,但是python中操作的大部分都是数据类型,所以不好比较,但是大抵上还是相近的