使用Python 2.7,我们期望以下代码
class T(object):
def __init__(self,x = list()):
self.x = x
self.x.append(0)
print self.x
a = T()
b = T()
打印
[0]
[0]
然而,实际发生的是以下
[0]
[0,0]
我无法发现为什么会发生这种情况,以及如何防止这种行为。很明显,默认参数中的[]突然变成对类的所有实例共享的对象的引用......但为什么呢?怎么能阻止这个?
答案 0 :(得分:1)
我认为你的意思是拿一份清单而不是对它的引用:
self.x = x[:]
最重要的是,您已经违反了默认参数的单个实例这一事实。然后你修改导致各种意外行为。处理这种情况的正常方法是这样的:
class T(object):
def __init__(self, x = None):
if x is None:
x = []
self.x = x[:]
self.x.append(0)
print self.x
如果您真的想要引用所提供的参数,那么您可以在上面用x[:]
替换x
。