对象的默认参数值

时间:2014-06-27 08:57:28

标签: python default-value

Python提供了一种为函数参数设置默认值的方法。一个例子是:

def f(x=3):
    print(x)

这是一个原始类型,让我们试试对象:

def f(x=list()):
    print(id(x))     
f()
  

44289920

f()
  

44289920

同样的对象!我很惊讶这是习惯于C / C ++的方式。完成后,我现在明白默认值不是在调用时构建,而是在定义时。

所以我找到了解决方案:

def f(x=list()):
    if len(x) == 0:
        x = list()
    print(id(x))

解决!但是以什么价格:在我看来这似乎不是一个非常干净的解决方案。 此解决方案依赖于使用len(x) == 0作为识别默认值的方法,该默认值对我的函数而言是Ok,而对其他函数则不然,因此解决方案可以概括为:

def f(x=None):
    if x is None:
        x = list()

这可以缩短为:

def f(x=None):
    x = x or list()  # a bit shorter version

我的问题是,有没有更短或更好的方法来解决这个问题?会不会是?

1 个答案:

答案 0 :(得分:2)

我仍然更喜欢“无”方法,但这里有一个新选项:如果只定义了类型,则创建一个新实例。

def f(x=list):
    if isinstance(x, type): x = x()
    print(id(x))