
嘻道奇闻
- 文章199742
- 阅读14625734
如何在Java Python JavaScript修改函数参数的值?
你是不是遇到过这种情况——在函数里修改了参数值,结果发现外面的变量根本没变?尤其是刚接触编程的新手,可能一边抓头发一边想:这代码怎么不按套路出牌啊!咱们今天就掰开了揉碎了说,用大白话讲明白这三个常用语言里的参数修改门道。
(小标题)??Java:倔强的值传递选手??
Java的参数传递简单来说就是:??基本类型传的是复印件,对象类型传的是原件地址??。举个例子,你给朋友发微信文档,要是发PDF(基本类型),他改得再狠也不会影响你手机里的文件;要是发在线文档链接(对象类型),他改的内容你也能实时看到。
咱们看个例子:
java复制// 基本类型修改失败案例 public static void changeNum(int num) { num = 20; } int myNum = 10; changeNum(myNum); System.out.println(myNum); // 还是10
这时候你可能会急得拍桌子:我都赋值20了怎么还是10?别急,用对象包装试试:
java复制class ValueHolder { int value; } public static void changeObj(ValueHolder holder) { holder.value = 20; } ValueHolder holder = new ValueHolder(); holder.value = 10; changeObj(holder); System.out.println(holder.value); // 成功变成20
(小标题)??Python:灵活的可变对象玩家??
Python的参数传递像是个魔术师:??传的都是引用,但能不能改要看对象本身能不能变??。比如数字、字符串这些不可变对象,就像石头刻的字改不动;列表、字典这些可变对象,就像白板写字随便擦改。
看这个典型翻车现场:
python复制def change_num(n): n += 10 x = 5 change_num(x) print(x) # 还是5
但换成列表就完全不一样了:
python复制def change_list(lst): lst.append(666) my_list = [1,2,3] change_list(my_list) print(my_list) # 变成[1,2,3,666]
(小标题)??JavaScript:让人又爱又恨的传值怪咖??
JS的参数传递机制常常让新人怀疑人生:??基本类型传值,对象传引用??。但有个坑爹的地方——就算传对象引用,如果直接替换整个对象,外面的变量还是不会变。
看看这个经典案例:
javascript复制function changeObj(obj) { obj = {name: '李四'} // 直接换对象 } let person = {name: '张三'} changeObj(person) console.log(person.name) // 还是张三
想要真的修改成功得这样操作:
javascript复制function changeProp(obj) { obj.name = '王五' // 改属性 } changeProp(person) console.log(person.name) // 变成王五
(问答环节)??Q:为什么有时候改得动参数,有时候改不动???
A:关键看两点:1. 参数是基本类型还是对象类型;2. 你修改的是整个参数还是参数的某个属性。就像租房时,房东给你钥匙(对象引用)后,你在屋里重新装修(改属性)房东看得见,但要是把房子推倒重建(替换整个对象),房东可不认账。
(对比表格)三种语言参数修改对比:
操作 | Java | Python | JavaScript |
---|---|---|---|
改基本类型参数 | 需要对象包装 | 无法直接修改 | 无法直接修改 |
改对象属性 | 直接生效 | 直接生效 | 直接生效 |
替换整个对象 | 不影响原对象 | 不影响原对象 | 不影响原对象 |
小编观点:参数修改这个知识点就像学骑自行车,刚开始总摔跟头,但一旦开窍了就发现规律其实很简单。记住三个关键词——??值传递、引用传递、可变性??,多写几个例子亲手试试,比看十篇教程都管用。编程路上哪有不踩坑的,这些坑踩明白了,后面学啥都顺溜!