python参数传递小记

0 写在前面

常用的参数传递分为值传递(对应形参)和引用传递(对应实参),形参和实参的一大区别就是改变形参原参数对象不会改变,而实参则会。
参考材料:
CSDN

1 值传递

方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
如下:

a=520
b=a
print(a,b)
b=600
print(a,b)

结果会是:

520 520
520 600

或者在函数中:

def add(a,b):
    a = a+b
    b = 3
    return a

a = 2
b = 1
print(a,b)
print(add(a,b))
print(a,b)

结果会是:

2 1
3
2 1

2 引用传递

也称地址传递,在方法调用时,实际上是把参数的引用(传的是地址,而不是参数的值)传递给方法中对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
如下:

a = [1,2]
b = a
print(a,b)
b[0] = 2 
print(a,b)
b = [2,3] # 相当于重新赋值
print(a,b)

结果会是:

[1, 2] [1, 2]
[2, 2] [2, 2]
[2, 2] [2, 3]

在函数中:

def add(a,b):
    a = a+b[0]
    b[0] = 3
    return a
a = 2
b = [1,3]
print(a,b)
print(add(a,b))
print(a,b)

结果会是:

2 [1, 3]
3
2 [3, 3]

3 小结

在Python中,数字、字符或者元组等不可变对象类型都属于值传递,而字典dict或者列表list等可变对象类型属于引用传递,因此涉及列表等的参数传递需小心仔细。如果希望字典进行值传递,则需要用到copy方法,copy分为浅拷贝和深拷贝。如下:

import copy
l1 = [[1, 2], 3]
l2 = copy.copy(l1)
l3 = copy.deepcopy(l1)
l2.append(4)
l2[0].append(5)
l3[0].append(6)
print(l1,l2,l3)

结果如下:

[[1, 2, 5], 3] [[1, 2, 5], 3, 4] [[1, 2, 6], 3]

如上,copy.copy属于浅拷贝,拷贝的是第一层list(l2[0]仍然是引用传递),而copy.deepcopy属于深拷贝,对list所有子元素都进行深拷贝。

原文地址:https://www.cnblogs.com/hzcya1995/p/13281711.html