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

一、本文简介

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

  • 41
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值