栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python和Java:传值还是传引用?(答案:python是pass by object reference!Java是pass by value!)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python和Java:传值还是传引用?(答案:python是pass by object reference!Java是pass by value!)

文章目录 1. 前言2. 探究历程2.1. 先探究python2.2. 再探究java2.3. 大一统 探究java和python的传值方式 3. 实例4. 本文结论

1. 前言

创作开始时间 2021年9月26日14:54:50

一直不太理解python到底是怎么一个传参数的方式 网上也众说纷纭 这里细细探究一下

2. 探究历程

挺曲折 看了大概一个小时吧
从点到面 举一反三。具体如下

MOTIVATION
Q 为什么要写这个探究历程
A 因为这个问题太难解答 不是只言片语就可以拿捏的。所以我觉得很有必要记录一下探究历程 以便大家复现 即 理想状态下 任何人按照下面的探究历程走一波 都能够很好的理解python和java的参数传递方式。

2.1. 先探究python

还是看了很多网页的 有些网页误导性也很强 就不放进来了 这里讲一下我的学习历程

1 参考 Is Python pass-by-reference or pass-by-value? https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/

我的理解
这里大概了解了pass by value pass by reference pass by object reference三种方式。
但是还是不懂object reference特别在哪里 感觉没讲清楚。

2 然后参考 Is Python call by reference or call by value [https://www.geeksforgeeks.org/is-python-call-by-reference-or-call-by-value/ 以及 Pass by Object Reference in Python](https://www.geeksforgeeks.org/is-python-call-by-reference-or-call-by-value/ 以及 Pass by Object Reference in Python) https://secon.utulsa.edu/cs2123/slides/pypass.pdf

我的理解
这里给了一些例子 但是并不能很好的说服我。

3 继续参考 #Day9 – Pass by Value, Pass by Reference, and Python’s Pass by Object Reference https://www.realpythonproject.com/day9-pass-by-value-pass-by-reference-and-pythons-pass-by-object-reference/

我的理解
感觉快说到点子上了 如下

Re-assigning a parameter, irrespective of whether it’s mutable or not will change it’s memory address. As a result, the changes won’t be reflected outside the function.

但是还是少了点什么。

2.2. 再探究java

1 参考 Is Java “pass-by-reference” or “pass-by-value”? https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value

我的理解
里面讲的都太好了 很多很专业的程序员 非常给力。
看了之后感觉非常清楚。java就是传值。但是传递的是变量的地址。

2 进一步参考 https://www.geeksforgeeks.org/g-fact-31-java-is-strictly-pass-by-value/

我的理解
看了下图 恍然大悟 虽然传的是object reference 对象引用 但是还是以pass by value的形式传递的 如下图 t这个对象被创建 然后调用change(t)的时候 传递的是t的地址 但是t的地址在这个change函数里面永远都不会变。因为是传值 实际上是传了一份copy进去 即 t地址的copy 。当t new Test();在函数内被调用的时候 外部的t的地址还是没有改变 只是内部的t的地址变了。

2.3. 大一统 探究java和python的传值方式

1 参考 Why are so many languages passed by value? https://softwareengineering.stackexchange.com/questions/153474/why-are-so-many-languages-passed-by-value 以及 Python and Java parameter passing [duplicate] https://softwareengineering.stackexchange.com/questions/153474/why-are-so-many-languages-passed-by-value

我的理解
这2个网页都挺有意思的。
特别是后一个网页。
进一步了解到 python和java其实都可以理解为 pass by value。还了解到C 是 pass by reference

3. 实例

给个python示例

def append(list):
 # 这里会反映到外部变量中。因为list指向的地址就是外部变量的地址
 list.append(1)
def reassign(list):
 # 这里不会反映到外部变量中。因为已经重新reassign了。list指向的地址已经变了 对应了一个新的内存地址。由于是传值 copy 所以根本不会反映到外部变量中。
 list [0, 1]
list_1 [0]
append(list_1)
print(list_1)
list_2 [0]
reassign(list_2)
print(list_2)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/266643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号