2

当我遇到一个意想不到的问题时,我正在用 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
4

1 回答 1

7

你掉进了一个常见的 Python 新手陷阱。使用列表作为默认变量def __init__(self, list = [0,0,0,0,0,0,0,0,0,0])意味着该类的所有实例与该参数的值共享相同的列表实例。另请参阅“Least Astonishment”和可变默认参数

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

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

管他呢。不像默认参数那样清楚地自我记录,但它有效。

作为旁注,不要list用作变量名,因为它会影响(有些常用的)list内置函数。

于 2012-11-14T23:59:53.303 回答