# 函数的定义相当于一次类型构造,默认值只在此时解析一次。# 而函数调用时不会重新执行默认参数的构造。所以,如果使用了字典,列表这样的可变类型。# 而又要在函数体内修改它,可能会出现意想不到的效果.def a(b=[]): b.append('hi') print bIn [11]: a()['hi']In [12]: a()['hi', 'hi']In [13]: a(['2'])['2', 'hi']In [14]: a()['hi', 'hi', 'hi']In [15]: a.func_defaultsOut[15]: (['hi', 'hi', 'hi'],)# 解决方法:参数默认值使用None赋值def(b = None): b = b or [] pass# 类属性也有类似问题class A(object): x = [] def __init__(self, c): self.x.append(c) # 这里的x搜索到类级别的x了而非实例的, # 因实例级别的x未事先定义In [36]: a1, a2 = A(1), A(2)In [37]: a1.x, a2.xOut[37]: ([1, 2], [1, 2])# 解决方法, 实例级别的属性事先定义class B(object): x = [] def __init__(self, c): self.x = [] # 此处实例属性有x,所以先搜索到此 self.x.append(c) In [38]: b1, b2 = B(1), B(2)In [39]: b1.x, b2.xOut[39]: ([1], [2])