1、* 和 ** 在形参里面时,收集参数
*:对于一个参数前面加上*,可以输入多个参数, 并将提供的所有值放在一个元组中收集起来,如果没有提供参数,将是一个空元组。
**:对于一个参数前面加上*,可以输入多个参数, 并将提供的所有值放在一个字典中收集起来,如果没有提供参数,将是一个空字典。
2、* 和 ** 在实参里面时,分配参数
*:在实参里面,输入参数时,* 将提供的元组、列表输入分配,作用和收集时相反的。
**:在实参里面,输入参数时,** 将提供的字典输入分配,作用和收集时相反的
具体的区别和联系可以详见下面的代码示例:
def story1(*params):
print(params)
def story2(*params):
print("There is a {job}, his name is {name}.".format_map(params[1]))
def story3(**params):
print(params)
def story4(**params):
print("There is a {job}, his name is {name}.".format_map(params))
num1 = [1, 2, 3]
info1 = {"name": "Tom", "job": "king"}
info2 = {"name": "Jhon", "job": "teacher"}
info3 = {"age": 16, "address": "beijing"}
story1(*num1) # 将列表3个值分配下去,相当于story(1,2,3)
story1(info1, info2) # 将多个字典变量作参数传入,最后收集起来作为一个元组
story2(info1, info2) # 参数传入后,将元组内的字典的值读取出来
story3(name="Tom", job="king") # 传入多个参数,收集后作为一个字典
story3(**info1, **info3) # 将多个字典参数分配,传入后重新变为一个字典
story4(**info1, **info3)
# 运行结果
(1, 2, 3)
({'name': 'Tom', 'job': 'king'}, {'name': 'Jhon', 'job': 'teacher'})
There is a teacher, his name is Jhon.
{'name': 'Tom', 'job': 'king'}
{'name': 'Tom', 'job': 'king', 'age': 16, 'address': 'beijing'}
There is a king, his name is Tom.