11

我注意到以下几点:

class c:
  def __init__(self, data=[]):
    self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]

这是正确的行为吗?

4

3 回答 3

12

是的,这是正确的行为。

但是,从您的问题来看,这似乎不是您所期望的。

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

规则 1. 不要使用可变对象作为默认值。

def anyFunction( arg=[] ):

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

相似地

def anyFunction( arg={} ):

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

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

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

于 2010-02-22T18:23:36.683 回答
4

This is a classic pitfall. See http://zephyrfalcon.org/labs/python_pitfalls.html, section 5: "Mutable default arguments"

于 2010-02-22T18:24:05.553 回答
1

然后总是做这样的功能:

def __init__ ( self, data = None ):
    if data is None:
       data = []

    self._data = data

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

于 2010-02-22T18:34:47.520 回答