首页 > 编程语言 >python参数传递与Java参数传递的对比

python参数传递与Java参数传递的对比

时间:2024-06-01 10:29:00浏览次数:27  
标签:传递 Java python 参数传递 对象 引用 可变

目录

一、本文简介

python参数传递的类型是“对象引用传递”,本文主要记录了python对象引用传递的概念辨析,并与Java中的参数传递进行了对比

二、参数传递的类型

值传递:传递的是变量的值,即传递的是变量的一个副本。函数内部对副本的修改不会影响到原始变量。

引用传递:传递的是变量的引用,即传递的是变量所指向的对象。函数内部对对象的修改会影响到原始变量。

三、python中参数传递的类型

Python的参数传递方式是一种特殊的引用传递。传递的是对象的引用,但对于可变对象不可变对象的处理方式不同。

3.1 可变对象与不可变对象

  • 可变对象(例如列表、字典、集合等):可以在原地修改它们的内容。函数内对这些对象的修改会影响到函数外部。
    def modify_list(lst):
        lst.append(4)
    
    my_list = [1, 2, 3]
    modify_list(my_list)
    print(my_list)  # 输出: [1, 2, 3, 4]
    
  • 不可变对象(例如整数、字符串、元组等):不能在原地修改它们的内容。函数内对这些对象的任何修改都会生成一个新的对象,而不会影响到函数外部的原对象。
    def modify_string(s):
        s += " world"
    
    my_string = "hello"
    modify_string(my_string)
    print(my_string)  # 输出: hello
    

3.2 对象引用传递和引用传递的区别

对象引用传递和引用传递之间的区别主要在于对对象的可变性和不可变性的处理方式。

  • 引用传递(Pass by Reference)
    在引用传递中,传递给函数的是变量的引用(即变量的地址)。函数内部对引用的修改会直接影响到函数外部的变量。例如C++中的指针。
    // C++示例
    void modify(int &x) {
        x = 10;
    }
    
    int main() {
        int a = 5;
        modify(a);
        std::cout << a; // 输出: 10
        return 0;
    }
    
    在这个例子中,modify函数接收变量a的引用,因此对x的修改直接反映到a上。
  • 对象引用传递(Object Reference Passing)
    在Python中,参数传递的是对象的引用。这种方式类似于引用传递,但处理可变和不可变对象的方式有所不同。Python函数内部接收到的是对象的引用,但是否能修改对象取决于对象本身的可变性。详见3.1部分

3.3 如何理解python中列表的"+"操作和append操作的区别

先看两个例子

// 例1
def f(x):
    return x + [4]

l = [1,2,3]
f(l)
print(l) // 输出: [1, 2, 3]

// 例2
def f(x):
    return x.append(4)

l = [1,2,3]
f(l)
print(l) // 输出: [1, 2, 3, 4]

python是对象引用传递,入参又是可变对象,例1的输出结果按理说应该和例2的结果是一致的,但为什么会有差别?
这就涉及到对python中列表的"+"操作和append操作的理解

  • 列表的"+"操作
    操作符用于连接两个列表,生成一个新的列表
  • 列表的 append() 操作
    append() 方法用于在列表的末尾添加一个元素,直接修改原列表

所以例1的入参l没有被修改

四、Java中参数传递的类型

结论:Java中参数传递是值传递,即将实参复制了一份传递给形参,只是复制的是实参的地址。
详细的解释可以参考:https://hollischuang.github.io/toBeTopJavaer/#/basics/object-oriented/java-pass-by
说的很详细

附录

Python中的可变对象与不可变对象:

不可变对象:整型(int)、浮点型(float)、布尔型(bool)、字符串(str)、元组(tuple)、冻结集合(frozenset)

不可变对象一旦创建,其状态就不能改变。也就是说,你不能在不可变对象上执行添加、删除、修改等操作。不可变对象的这种特性,使得我们可以安全地进行hash操作,将不可变对象用作字典的键或者添加到集合中。线程安全,不可变对象在多线程环境中也更为安全,因为它们的状态不会被其他线程改变。

可变对象:列表(list)、集合(set)、字典(dict)、bytearray、自定义的类(如果类的属性可以修改)

可变对象在创建后,其状态可以改变。也就是说,你可以在可变对象上执行添加、删除、修改等操作。可变对象的这种特性,使得我们可以灵活地对对象进行操作,并且不需要每次操作都创建一个新的对象。在多线程编程时,通常需要使用锁或者其他同步机制来保护可变对象的状态。
参考自:https://blog.csdn.net/qq_41897558/article/details/135403821

标签:传递,Java,python,参数传递,对象,引用,可变
From: https://blog.csdn.net/Jeffreyhh/article/details/139335629

相关文章

  • Python While 循环语句
    Python编程中while语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:```while判断条件(condition):  执行语句(statements)……```执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值......
  • 运用JavaScript代码,使用Three.js框架在网页中实现3D效果,零基础入门Three.js,包含具体实
    不经意间看到了某个大佬做的网站~实在是太帅啦!查了查实现该效果的技术——原来是Three.js如果你也感兴趣的话,那就让我们来从零开始学习Three.js动态3D效果吧✨一、了解Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使......
  • 【华为OD】D卷真题100分:分割数组的最大差值 Java代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、Java、python、C、C++代码实现:【华为OD】D卷真题100分:分割数组的最大差值JavaScript代码实现[思路+......
  • JAVAEE之文件IO_数据流概念,字节流:InputStream、OutputStream,字符流:reader、writer,及实
    什么是数据流 顾名思义,I表示input,O表示output,也就是输入输出流,主要是在程序与文件之间,用于传输数据的通道。既然要传输数据,那么我们需要理解文件和程序之间哪种方向的传输是输入流,哪种传输作为输出流?我们可以举一个例子,如下图所示: IO流是JavaIO中的核心概念。流......
  • 基于OJ的Java课程实验管理系统的设计与实现论文
    摘要课程实验网站是一个为课程提供全面、准确、及时课程实验的在线平台。它汇聚了各地的课程体验。该网站通过丰富的图片形式展示课程,让课程者提前感受到社区的乐趣。同时,它还提供了详细的课程攻略和实用建议,帮助课程者避免社区中的陷阱和误区,确保行程顺利。本课程实验......
  • Python 运算符
    相关学习资料什么是运算符?本章节主要说明Python的运算符。举个简单的例子 4+5=9 。例子中,4 和 5 被称为操作数,+ 称为运算符。Python语言支持以下类型的运算符:算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级接下来让......
  • [转帖]一次Java内存占用高的排查案例,解释了我对内存问题的所有疑问
     https://segmentfault.com/a/1190000044152595 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。问题现象7月25号,我们一服务的内存占用较高,约13G,容器总内存16G,占用约85%,触发了内存报警(阈值85%),而我们是按容器内存60%(9.6G)的比例配置的JVM堆内存......
  • java通过冒泡排序对数组进行排序
    冒泡排序是从列表第一个元素开始,比较相邻两个元素大小,小的排在前面,大的排后面,循环反复,小的数据会像气泡那样上浮。packageproject;publicclassMaopaopaixu{ publicstaticvoidmain(String[]args){ //冒泡排序 int[]arr={9,8,3,5,2}; for(inti=0;i<arr.le......
  • 在Python中使用生成器:高效处理大型数据集
    生成器是Python中强大且高效的概念,它能够帮助我们处理大型数据集,同时节省内存空间。本文将深入讨论生成器的概念、用法和优势,通过代码案例帮助读者更容易理解和掌握这一高级知识点。生成器的介绍生成器是一种特殊的迭代器,它能够在需要时生成值,而无需在内存中同时存储所有......
  • python 通过 subprocess 运行的代码 exit(1) 不能使得pipeline fail
    在使用Python的subprocess模块运行外部命令时,如果你希望子进程的退出状态码能够影响Python脚本的执行结果,尤其是在使用管道(pipeline)时,你需要手动检查子进程的返回码并采取相应的措施。简单地使用subprocess.run或subprocess.call运行子进程并不会自动使Python脚......