- 1. 前言
- 2. 探究历程
- 2.1. 先探究python
- 2.2. 再探究java
- 2.3. 大一统:探究java和python的传值方式
- 3. 实例
- 4. 本文结论
创作开始时间:2021年9月26日14:54:50
一直不太理解python到底是怎么一个传参数的方式,网上也众说纷纭,这里细细探究一下!
2. 探究历程挺曲折,看了大概一个小时吧!
从点到面,举一反三。具体如下:
MOTIVATION:
Q:为什么要写这个探究历程?
A: 因为这个问题太难解答,不是只言片语就可以拿捏的。所以我觉得很有必要记录一下探究历程,以便大家复现,即:(理想状态下)任何人按照下面的探究历程走一波,都能够很好的理解python和java的参数传递方式。
还是看了很多网页的,有些网页误导性也很强,就不放进来了,这里讲一下我的学习历程:
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. 再探究java1)参考: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的地址变了。
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
给个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)
listA = [0]
listB = listA
listB.append(1)
print(listA)
listA = [0]
listB = listA
listB = [0, 2]
print(listA)
a = 1
b = a
print(id(a), id(b))
print(a, b)
a+= 1
print(id(a), id(b))
print(a, b)
输出:
[0, 1] [0] [0, 1] [0] 94013604373440 94013604373440 1 1 94013604373472 94013604373440 2 14. 本文结论
本文结论:
- Python确实是pass by object reference(对象引用传递),但是!这其实是一种特殊的值传递(pass by value)!!!
- Java确实是pass by value(值传递)。java和python的参数传递方式非常相似(我觉得是一样的)。
目前就写到这,欢迎讨论交流。
创作结束时间:2021年9月26日15:25:40



