1.参数的传递_不可变对象含可变子对象
传递不可变对象时,不可变对象里面包含的子对象是可变的。则方法内修改了这个可变对象,源对象也发生了变化。
a = (10, 20, [5, 6])
print("a:", id(a)) #输出:a: 1910938649528
def tast01(m):
print("m:", id(m)) #输出:m: 1910938649528
m[2][0] = 888
print(m) #输出:(10, 20, [888, 6])
print("m:", id(m)) #输出:m: 1910938649528
tast01(a)
print(a) #输出:(10, 20, [888, 6])
2.参数的类型
(1)位置参数_默认值参数_命名参数
函数调用时,实参默认按位置顺序传递,需要个数和形式匹配。
按位置传递的参数,称为:“位置参数”。
# 测试位置参数
def tast01(a, b, c, d):
print("{0}-{1}-{2}-{3}".format(a, b, c, d))
# 默认值参数,必须位于普通位置参数后面
def tast02(a, b, c=10, d=20):
print("{0}-{1}-{2}-{3}".format(a, b, c, d))
tast01(10, 20, 30, 40) #输出:10-20-30-40
# tast01(10,20) 参数个数不匹配,报错
# 命名参数,通过形参名称来匹配
tast01(d=20, b=40, c=30, a=60) #输出:60-40-30-20
tast02(2, 3) #输出:2-3-10-20
tast02(2, 3, 4) #输出:2-3-4-20
(2)可变参数
1.*param(一个星号),将多个参数收集到一个“元组”对象中。
2.**param(两个星号),将多个参数收集到一个“字典”对象中。
强制命名参数:
在带星号的“可变参数”后面增加新的参数,必须是“强制命名参数”。
# 可变参数
def f1(a, b, *c):
print(a, b, c)
def f2(a, b, **c):
print(a, b, c)
def f3(a, b, *c, **d):
print(a, b, c, d)
# 强制命名参数
def f4(*a, b, c):
print(a, b, c)
f1(8, 9, 19, 20) #输出:8 9 (19, 20)
f2(8, 9, name="ZJ", age=24) #输出: 8 9 {'name': 'ZJ', 'age': 24}
f3(8, 9, 20, 30, name="ZJ", age=24) #输出:8 9 (20, 30) {'name': 'ZJ', 'age': 24}
# f4(2,3,4) 报错:由于a是可变参数,将2,3,4全部收集,造成b和c没有赋值。
f4(2, b=3, c=4) #输出:(2,) 3 4