我注意到以下几点:
class c:
def __init__(self, data=[]):
self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]
这是正确的行为吗?
我注意到以下几点:
class c:
def __init__(self, data=[]):
self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]
这是正确的行为吗?
是的,这是正确的行为。
但是,从您的问题来看,这似乎不是您所期望的。
如果您希望它符合您的期望,请注意以下事项:
规则 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
这是提供一个新的空列表对象的默认参数值的常用方法。
This is a classic pitfall. See http://zephyrfalcon.org/labs/python_pitfalls.html, section 5: "Mutable default arguments"
然后总是做这样的功能:
def __init__ ( self, data = None ):
if data is None:
data = []
self._data = data
或者,您也可以使用data = data or []
,但这会阻止用户传递空参数(''
、0
等False
)。