函数传参传的是啥的思考【java Python】
今天看《java 核心 卷1》的时候,作者提到了函数传参的问题,他提到,java传参,传的是值,而不是引用,然后,函数将要传的实参的值(如果实参是基本数据类型,那么就是值。如果实参是对象,则是内存地址)拷贝之后,赋予形参,然后,对形参进行操作。如果是8个基本类型,那么无论如何操作,都不会对原来的实参产生影响。如果要传的实参是对象,由于原来的实参和形参都是指向的同一个对象,所以,所有对形参的操作都将作用到原来的东西上,但是如果对形参进行了重新赋值,那么只是改变了形参的指向,那么将不会在对原来的实参产生影响。
public class ArgDemo {
public static void improve(int x,int y){
System.out.println(x); //10
System.out.println(y); //10
x += 10;
y += 20;
System.out.println(x); //20 这是在a b 的副本,x y上的操作。函数结束,就释放了
System.out.println(y); //30
}
public static void main(String[] args){
int a = 10 ;
int b = 10 ;
improve(a,b);
System.out.println(a); //10
System.out.println(b);//10
}
}
public class ArgDemo {
public static void change(String x,String y){
System.out.println(x); //hello
System.out.println(y); //world
String temp = x;
x = y;
y = temp;
System.out.println(x); //world//这里 x,y 的值已经发生了改变,如果穿的是参数(或者是如果传的是对象本身)的话,那么main函数里面的
System.out.println(y); //hello // 的x,y 也应该发生了改变。。事实是是没有变化的,这里操作的是a和b的副本。
zhixiang
}
public static void main(String[] args){
String a = "hello" ;
String b = "world" ;
change(a,b);
System.out.println(a); //hello //这里和刚传进去的形参是一样的,且和原来一样,所以说,形参是 它们的副本。
System.out.println(b); //world
}
}
并给出了结论:
1、一个方法不能修改一个基本数据类型的参数(数值型或布尔型)
2、一个方法可以改变一个对象参数的状态(相当于在对象修改自身)
3、一个方法不能让对象参数引用一个新的对象(相当于对参数也就是副本进行了重新赋值,这仅会影响参数的的指向,而不会影响实参的的指向)
我想到了Python中的传参问题,Python中一切皆对象。
a = [1,2,3]
b = [1,2,5]
print("bef a ================ "+str(id(a)))#140286697654752
print("bef b ================ "+str(id(b)))#140286697655760
def change(x,y):
print("x ======== "+ str(id(x)))# 140286697654752
print("y ======== "+ str(id(y)))#140286697655760
temp = x #这里采用笨方式进行x,y的交换
x = y
y = temp
print("x aft============= "+ str(id(x)))#140286697655760
print("y aft============= "+ str(id(y)))#140286697654752
change(a,b)
print(a)#[1, 2, 3]
print("bef a ================ "+str(id(a)))#140286697654752
print("bef b ================ "+str(id(b)))#140286697655760
print(b)#[1, 2, 5]
############################################################################
a = "zmu"
b = "muzdda"
print("bef a ================ "+str(id(a)))#139816005403104
print("bef b ================ "+str(id(b)))#139816005403152
def change(x,y):
print("x ======== "+ str(id(x)))# 139816005403104
print("y ======== "+ str(id(y)))#139816005403152
temp = x #
x = y
y = temp
print("x aft============= "+ str(id(x)))#139816005403152
print("y aft============= "+ str(id(y)))#139816005403104
change(a,b)
print(a)#zmu
print("aft a ================ "+str(id(a)))#139816005403104
print("aft b ================ "+str(id(b)))#139816005403152
print(b)#muzdda
函数传参传的是啥的思考【java Python】的更多相关文章
- Java函数的传参机制
一 最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了. 我就打算好好理一理java的传参机制,整理一番 二 很多人一听Java的传参,那一定会脱口而出,java ...
- js动态绑定click事件时function传参问题
今天碰到了这样一个问题,我在javascript中动态创建了一个button, 然后我想给改button添加click事件,绑定的function想要传入一个变量参数, 一开始我想直接通过函数传参传进 ...
- ajax 传参 乱码问题
http://blog.csdn.net/yiyuhanmeng/article/details/7548505 开发一直用firfox网页,调试什么的都很方便.所以遇到了浏览器之间的兼容问题.url ...
- 再谈Java方法传参那些事
把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机 ...
- c++11中关于`std::thread`线程传参的思考
关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...
- java调用py文件传参执行
java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...
- vue 组件传参
路由配好了 再传个参呗 注:组件信息流转的时候只能单向1 > 父子传参传参:通过属性prop:传递数据 a.父组件传参给子组件 子组件: <ul> <li v-for=&quo ...
- java与js交互,相互调用传参
随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等.下面就来看一下java与js交互的简单demo. ...
- vue路由传参并跳转页面
在vue项目中参数的传递可以使用本地缓存或者Vuex,那么vue能不能像小程序一样路由传参呢,显然是可以的而且非常简单 方式一:query传参 //传参 go(){ that.$router.push ...
随机推荐
- mysql连接状态
mysql连接状态 mysqladmin -uroot -h127.0.0.1 status mysqladmin -uroot -h127.0.0.1 processlist
- Windows 2016 无域故障转移群集部署方法 超详细图文教程 (二)
上一章我们配置了一台设备,接着根据那个配置,配置其它设备.这里我配置了三台设备: 创建故障转移群集,并添加设备. 之前的操作都是每台服务器都要做的,而这个操作,只需要任选一台去做即可,我这里选d1 1 ...
- HDFS操作及小文件合并
小文件合并是针对文件上传到HDFS之前 这些文件夹里面都是小文件 参考代码 package com.gong.hadoop2; import java.io.IOException; import j ...
- vue elment-ui 样式替换 input select
# 有时候经常需要替换element-ui的样式 第一种方法: 直接修改源码,样式路径如下 直接修改idnex.css即可. 第二种方法: 直接在当前页面修改,替换掉原来的样式. <style ...
- MySQL库操作,表操作,数据操作。
数据库服务器:本质就是一台计算机,该计算机上安装有数据库管理软件的服务端,供客户端访问使用. 1数据库管理系统RDBMS(本质就是一个C/S架构的套接字),关系型数据库管理系统. 库:(文件夹)- ...
- 测试oracle数据库连接
1.ping 192.168.0.12.telnet 192.168.0.1 1521 按下ctrl+] 组合键出现命令回显才是端口连接成 3.tnsping 192.168.0.1:1521/db
- Django实现瀑布流,组合搜索
Django中组合搜索功能 需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL ...
- 'ascii' codec can't decode byte 0xd6 in position 0
使用elastalert,执行python文件时报错: 经查,python命令下输出中文字符时需要将编码指定为gb2312,一开始博主也不知道是输出在控制台的信息编码格式问题,一直以为是博主自己的ya ...
- StanFord ML 笔记 第四部分
第四部分: 1.生成学习法 generate learning algorithm 2.高斯判别分析 Gaussian Discriminant Analysis 3.朴素贝叶斯 Navie Baye ...
- unicode转中文以及str形态的unicode转中文
今天在工作中遇到这样一个问题(工作环境为Python2.7.1),需要将一个字典中字符串形态的Unicode类型的汉字转换成中文,随便总结一下: 1.unicode转中文 old = u'\u4e2d ...