Python关键字参数函数调用等价性疑问:foo(arg1=123, arg2=None)与foo(arg1=123)是否等价?
两种Python函数调用是否等价?
嘿,这个问题的答案得看foo函数本身是怎么定义的,分几种情况跟你唠唠:
情况1:arg2的默认参数就是None
如果foo的定义是这样的:
def foo(arg1, arg2=None): # 函数逻辑
那这两种调用完全等价。因为显式传递arg2=None和使用参数的默认值效果完全一致——函数内部拿到的arg2都是None。
举个实际运行的例子:
def foo(arg1, arg2=None): print(f"arg1: {arg1}, arg2: {arg2}") foo(arg1=123, arg2=None) # 输出:arg1: 123, arg2: None foo(arg1=123) # 输出:arg1: 123, arg2: None
情况2:arg2的默认参数不是None
如果foo的定义里arg2有其他默认值,比如:
def foo(arg1, arg2=0): # 函数逻辑
那这两种调用绝对不等价。第一种调用会把arg2强制设为None,而第二种会使用默认值0,函数执行的结果大概率会不一样。
看例子:
def foo(arg1, arg2=0): print(f"arg1: {arg1}, arg2: {arg2}") foo(arg1=123, arg2=None) # 输出:arg1: 123, arg2: None foo(arg1=123) # 输出:arg1: 123, arg2: 0
情况3:arg2没有默认参数
如果foo的定义要求必须传递arg2,没有默认值:
def foo(arg1, arg2): # 函数逻辑
那第二种调用foo(arg1=123)会直接抛出TypeError,因为缺少了必需的参数arg2,连执行都做不到,自然和第一种调用完全不等价。
例子:
def foo(arg1, arg2): print(f"arg1: {arg1}, arg2: {arg2}") foo(arg1=123, arg2=None) # 正常执行,输出:arg1: 123, arg2: None foo(arg1=123) # 报错:TypeError: foo() missing 1 required positional argument: 'arg2'
总结
一句话:只有当foo函数中arg2参数的默认值恰好是None时,foo(arg1=123, arg2=None)和foo(arg1=123)这两种调用才是等价的;其他任何情况,两者的行为都不一样。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

