函数参数默认值的Python样式指南

函数参数默认值的Python样式指南,python,Python,不将实例创建为默认值: def foo(v1=None): if v1 is None: v1 = Foo() def foo(v2=Foo()): 创建实例作为默认值: def foo(v1=None): if v1 is None: v1 = Foo() def foo(v2=Foo()): python风格中首选哪种方式 如果您希望在每次调用该函数时创建一个新实例,则此操作有效: def foo(v1=None): if v1 is None:

不将实例创建为默认值:

def foo(v1=None):
  if v1 is None:
    v1 = Foo()
def foo(v2=Foo()):
创建实例作为默认值:

def foo(v1=None):
  if v1 is None:
    v1 = Foo()
def foo(v2=Foo()):

python风格中首选哪种方式

如果您希望在每次调用该函数时创建一个新实例,则此操作有效:

def foo(v1=None):
    if v1 is None:
        v1 = Foo()
这是行不通的:

def foo(v2=Foo()):
    pass

为什么??因为默认参数值在每个模块加载时只计算一次,这通常发生在程序启动时。加载包含此代码的模块后,将不再计算默认参数。

如果
Foo
是可变的(此处可能是这种情况),则第一个参数是可变的。如果您以某种方式确保
Foo
是不可变的,那么第二个也可以。@rdas或者您从未计划对其进行变异……无论如何,这不是样式问题。这两件事在语义上是不同的,right@juanpa.arrivillaga-尽管我要强调的是,计划某事并不一定意味着它永远不会发生。如果我知道
Foo
是不可变的,如果我在第二次使用它,我会呼吸更轻松way@rdas为什么?如果您希望它是可变的并可重复使用,该怎么办?同样,这里的问题是语义是不同的,这是否合适不是样式的问题为什么“不正确”?如果那是你想要的呢?这里的问题是,这两个不同的定义具有不同的语义,因此它是正确的还是不正确的取决于您的意图。@juanpa.arrivillaga good point。我更新了答案,谢谢你@DavidRobles。我刚刚通过一个小实验进行了验证。是的,你是对的。第二种方法在多次调用foo()时总是使用相同的引用。