它比你想象的要多得多。考虑默认值是静态的(=指向一个对象的常量引用)并存储在定义中的某处;在方法定义时进行评估;作为类的一部分,而不是实例。由于它们是恒定的,因此它们不能依赖于self
。
这是一个例子。这是违反直觉的,但实际上非常有意义:
def add(item, s=[]):
s.append(item)
print len(s)
add(1) # 1
add(1) # 2
add(1, []) # 1
add(1, []) # 1
add(1) # 3
这将打印1 2 1 1 3
.
因为它的工作方式与
default_s=[]
def add(item, s=default_s):
s.append(item)
显然,如果你修改default_s
,它会保留这些修改。
有多种解决方法,包括
def add(item, s=None):
if not s: s = []
s.append(item)
或者你可以这样做:
def add(self, item, s=None):
if not s: s = self.makeDefaultS()
s.append(item)
然后该方法makeDefaultS
将有权访问self
.
另一种变化:
import types
def add(item, s=lambda self:[]):
if isinstance(s, types.FunctionType): s = s("example")
s.append(item)
这里的默认值s
是工厂函数。
您可以结合所有这些技术:
class Foo:
import types
def add(self, item, s=Foo.defaultFactory):
if isinstance(s, types.FunctionType): s = s(self)
s.append(item)
def defaultFactory(self):
""" Can be overridden in a subclass, too!"""
return []