从对象列表中的列表中删除项目时,该项目也将从其他对象的列表中删除

时间:2012-10-16 01:09:29

标签: python list

所以我有一个叫做cell的类:

class cell:
    possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
    value = None;

    def __init__(self, value):
        if value == "":
            self.value = "0"
        else:
            self.value = value

if __name__=="__main__":
    mlist = [cell("2"), cell("6"), cell("8")]
    mlist[2].possibles.remove("3")
    print mlist[0].possibles

输出结果为:

['1', '2', '4', '5', '6', '7', '8', '9']

当我从第三个项目中明确删除它时,为什么会从数组的第一项中删除值?

4 个答案:

答案 0 :(得分:2)

这是一个常见的Python问题。每次cell写入的方式都有对同一列表实例的引用。您可以为每个id(mlist[i].possibles)打印i来检查这一点。

要创建单独的列表,请将初始化移至构造函数:

def __init__(self, value):
    self.possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]

答案 1 :(得分:1)

这种情况正在发生,因为您已将possibilities定义为类变量,而不是实例变量。

possibilities移至__init__(作为self.possibilities),您应该没问题

答案 2 :(得分:1)

mlist = [cell("2"), cell("6"), cell("8")]

这里没有三个不同的列表,但是对同一个列表有三个引用。任何变化都会影响所有。

答案 3 :(得分:0)

正如其他人所说,你应该做一个实例变量。通过将value参数默认设置为0,您也可以不使用if ... else子句。

    class cell:
        def __init__(self, value=0):
            self.possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
            self.value = value

    if __name__=="__main__":
        mlist = [cell("2"), cell("6"), cell("8")]
        mlist[2].possibles.remove("3")


>>> mlist[0].possibles
['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> mlist[2].possibles
['1', '2', '4', '5', '6', '7', '8', '9']
>>>