还有比您想象的更多的东西。 认为默认值是静态的(=指向一个对象的常量引用)并存储在定义中的某个位置。 在方法定义时进行评估; 作为类的一部分,而不是实例。 由于它们是常数,因此不能依赖s。
这是一个例子。 这是违反直觉的,但实际上很合理:
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
这将打印s。
因为它的工作方式与
default_s=[]
def add(item, s=default_s):
s.append(item)
显然,如果您修改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)
然后,方法s将可以访问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 []