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