java和python的参数传递方式

java,是对同一地址的参数修改

package com.haiyu.manager;
import java.util.ArrayList;
import java.util.List;

public class TestMain {


    public static void main(String[] args) {
        //基本类型,作为参数传递时,传递的是值的拷贝,无论怎么改变这个拷贝,原值是不会改变的。
        int a = 1;
        System.out.println("改之前的值:" + a); // 1
        System.out.println(System.identityHashCode(a)); // 7215991
        modify(a);
        System.out.println("改之后的值:" + a); // 1
        System.out.println(System.identityHashCode(a));// 7215991
        //包装类
        Integer b = new Integer(1);
        System.out.println("改之前的值:" + b); // 1
        System.out.println(System.identityHashCode(b)); // 25195604
        modify(b);
        System.out.println("改之后的值:" + b); // 1
        System.out.println(System.identityHashCode(b)); // 25195604
        //集合类,传递的值是指向真实对象的地址,会通过地址找到真实的对象进行赋值操作。
        List<String> nums = new ArrayList<>();
        System.out.println("改之前的值:" + nums); // 改之前的值:[]
        System.out.println(System.identityHashCode(nums)); // 31215298
        modify(nums);
        System.out.println("改之后的值:" + nums);// 改之后的值:[ssss]
        System.out.println(System.identityHashCode(nums)); // 31215298
        //数组
        int[] c = new int[1];
        System.out.println("改之前的值:" + c[0]); // 0
        System.out.println(System.identityHashCode(c)); // 20132171
        modify(c);
        System.out.println("改之后的值:" + c[0]);// 1
        System.out.println(System.identityHashCode(c)); // 20132171

    }
    private static void modify(int nums) {
        nums = 4;
        System.out.println(System.identityHashCode(nums)); //30045997
    }
    private static void modify(Integer nums) {
        nums = 128;
        System.out.println(System.identityHashCode(nums)); //21581759
    }
    private static void modify(List<String> nums) {
        nums.add("ssss");
        System.out.println(System.identityHashCode(nums)); //31215298
    }
    private static void modify(int[] nums){
        nums[0] = 1;
        System.out.println(System.identityHashCode(nums));//20132171
    }
}

python传递方式

if __name__ == '__main__':
    nums = []
    print(id(nums))
    # =============================值传递方式==========================================
    nums.append(1)
    nums.append(2)
    nums.append(3)
    nums.append(4)
    nums.append(5)
    print("nums的内容:{}".format(nums))
    print("append方法新增元素后nums的id:{}".format(id(nums)))

    nums.extend([4])
    print("nums的内容:{}".format(nums))
    print("extend方法新增元素后nums的id:{}".format(id(nums)))

    nums.pop()
    print("pop方法删除nums元素后nums的内容:{}".format(nums))
    print("pop方法删除nums元素后nums的id:{}".format(id(nums)))

    nums.remove(nums[len(nums) - 1])
    print("remove方法删除nums元素后nums的内容:{}".format(nums))
    print("remove方法删除nums元素后nums的id:{}".format(id(nums)))
    # 用个新地址保存下当前的值
    temp = [i for i in nums]
    print("temp的内容为:{}".format(temp))
    print("temp的内存地址为:{}".format(id(temp)))
    del nums[len(nums) - 1]
    print("del方法删除nums元素后nums的内容:{}".format(nums))
    print("del方法删除nums元素后nums的id:{}".format(id(nums)))

    # =========================引用传递===============================
    # 创建内存地址存储nums + [4]的结果
    print("为[4]创建一个内存地址:{}".format(id([4])))
    print("[4]的内容为:{}".format([4]))
    print("为nums + [4]创建一个内存地址:{}".format(id(nums + [4])))
    print("nums + [4]的内容为:{}".format(nums + [4]))
    print("nums的内容为:{}".format(nums))
    print("nums的地址为:{}".format(id(nums)))
    # a的内存地址指向34行已创建的地址
    a = [4]
    print("a的内存地址为:{}".format(id(a)))
    # nums的地址指向了35行创建的地址
    nums = nums + a
    print("nums的内容为:{}".format(nums))
    print("nums的地址为:{}".format(id(nums)))
    print(nums, temp) # temp25行new的一个对象,保存的值与nums的值一致
    print(nums == temp)
    print(nums is temp)


#==============传值的参数类型
a = 1
b = (0, 1)
c = 'a'
def add(a):
    a += 1
add(a)
print(a) # 1
def add_tuple(b):
    b[0] += 1
add_tuple(b) # TypeError: 'tuple' object does not support item assignment
print(b)
def add_str(c):
    c += 'c'
add_str(c)
print(c) # a
# ===============传地址类型
f = {"a":1}
print(id(f))
g = {1,2}    # 1618579705344
print(id(g)) # 1618582633824
def add_dict(a):
    a["a"] += 1
add_dict(f)
print(f)     # {'a': 2}
print(id(f)) # 1618579705344
def add_set(a):
    a.add(12)
add_set(g)
print(g)     # {1, 2, 12}
print(id(g)) # 1618582633824
d = ([0], 1) # 特殊形式, 对于元组中元素为可变参数时,可变部分是可以修改成功的,因为传递的内存地址
print(id(d))# 2360117525568
print(id(d[0]))# 2360117536000
print(id(d[0][0]))# 2360112802064
print(id(d[1]))# 2360112802096
def add_tuple_1(d):
    d[0][0] += 1
add_tuple_1(d)
print(d) #([1], 1)
def add_tuple_2(d):
    d[1] += 1
add_tuple_2(d)
print(d) #TypeError: 'tuple' object does not support item assignment
class Temp(object):
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def set_name(self, name):
        self._name = name


def modify(x: Temp):
    x.set_name = "B"
    print(id(x))  # 1827547160528
    c = Temp("C")
    print(id(c))  # 1827547160336
    print(c.name)  # C


if __name__ == '__main__':
    # 类对象作为入参,会根据地址找到对应的类在进行修改,所以属于值传递形式,传递的是地址值
    a = Temp("A")
    print(a.name)  # A
    print(id(a))  # 1827547160528
    modify(a)
    print(a.name)  # B
    print(id(a))  # 1827547160528

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值