为什么两个类实例似乎共享相同的数据?

时间:2012-11-14 23:40:57

标签: python class

当我遇到一个意想不到的问题时,我在Python上做了一些工作。我有一个类,两个变量x和y。 x和y意味着是类的独立副本,每个副本都有自己的数据。所以我设置x等于类并给它一些值,然后用y做同样的事。一旦我尝试使用该数据,我意识到我覆盖了x的值。似乎我没有创建两个单独的类副本来使用,而是两个引用同一个类。所以这是代码中的一般示例:

x = someClass()
x.set(2, 0)
y = someClass()
y.set(3, 0)
print(x)

最终结果是打印3而不是2.我想创建一个单独的“版本”类来保存每个变量的不同数据。不确定如何。使用Python 3.3。这是该类的代码:

class someClass:
    def __init__(self, list = [0,0,0,0,0,0,0,0,0,0]):
        self.list = list
    def __repr__(self):
        return str(self.list)
    def set(self, loc, val):
        if ((loc >= 0) & (loc <= 9)):
            self.list[loc] = val

1 个答案:

答案 0 :(得分:6)

你陷入了Python的常见新手陷阱。像使用def __init__(self, list = [0,0,0,0,0,0,0,0,0,0])一样使用列表作为默认变量意味着该类的所有实例与该参数的值共享相同的列表实例。另请参阅"Least Astonishment" and the Mutable Default Argument

顺便说一句,如果你想使用一个容器对象(如列表作为默认参数),一个常见的习惯用法就是使用None并检查它。例如:

def __init__(self, values=None):
    if values is None:
        values = [0] * 10

或者其他什么。不像默认参数那样清楚地自我记录,但它有效。

作为旁注,请不要将list用作变量名称,因为它会影响(有点常用的)list内置。