python中函数的默认值

Default value in a function in Python

本问题已经有最佳答案,请猛点这里访问。

我注意到以下情况:

1
2
3
4
5
6
7
8
class c:
  def __init__(self, data=[]):
    self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]

这是正确的行为吗?


是的,这是正确的行为。

然而,从你的问题来看,这似乎不是你所期望的。

如果您希望它符合您的期望,请注意以下几点:

规则1。不要将可变对象用作默认值。

1
def anyFunction( arg=[] ):

不会创建新的列表对象。arg的默认列表对象将在各地共享。

同样地

1
def anyFunction( arg={} ):

不会创建新的dict对象。将共享此默认dict。

1
2
3
class MyClass( object ):
    def __init__( self, arg= None ):
        self.myList= [] if arg is None else arg

这是提供一个新的空列表对象的默认参数值的常用方法。


这是一个典型的陷阱。参见http://zephyrfalcon.org/labs/python_pitfalls.html,第5节:"可变默认参数"


总是这样做,然后:

1
2
3
4
5
def __init__ ( self, data = None ):
    if data is None:
       data = []

    self._data = data

或者,您也可以使用data = data or [],但这样可以防止用户传递空参数(''0False等)。