Python:当append()函数中输入的对象发生变化时,对象列表会发生变化

2024-06-16 13:50:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类的对象列表。更改append函数中使用的对象时,列表也会更改。为什么?我来自C++,所以这很奇怪。在

我有以下代码:

    class state:

    def __init__(self):
            self.x=list([])
            self.possibleChests=list([])
            self.visitedChests=list([])

    def __str__(self):
            print "x ",
            print self.x
            print "possibleChests ",
            print self.possibleChests
            print "visitedChests ",
            print self.visitedChests
            return ""


    def addKey(self,key):
            self.x.append(key)

    def __eq__(self,other):
            if isinstance(other,self.__class__):
                    return self.__dict__==other.__dict__
            else:
                    return False


    current_state=state()

    current_state.addKey(4)
    current_state.possibleChests.extend([1,2,4])
    current_state.visitedChests.append(5)

    visitedStates=list([])

    visitedStates.append(current_state)

    current_state.addKey(5)


    if(current_state in visitedStates):
            print "Got ya!!"

    else:
            print "Not in list!!"

我得到了输出:

^{pr2}$

我已经更改了当前的状态对象,所以它不应该出现在列表中。在


Tags: 对象self列表returndefcurrentliststate
2条回答

When I change the object that I use in the append function, the list also changes.

而不是共享一个新的对象。在

=append这样的操作共享一个引用,不创建新对象。您可以通过再次调用state()来创建一个新的非重复状态。您可以使用复制模块创建copy

from copy import deepcopy

visitedStates.append(deepcopy(current_state))

您的state对象是可变的。当你调用current_state.addKey(5)时,你修改了current_state,但是所有指向它的指针仍然指向它。在python中,list只包含指向对象的指针。对于可变列表,你也有同样的情况:

l1 = [ 1, 2]
l2 = l1
l1.append(3)
l2
=> shows [1, 2, 3]

对于字符串,您不能有相同的东西(例如),因为它们是不可变的。不能修改它们,只能指向另一个字符串

^{pr2}$

当您在循环之外创建一个对象,并在循环中对其进行修改并将其添加到列表中时,这是一个常见的错误源:在循环的末尾,您有一个列表,其中包含n次具有上一个值的同一对象。这不是Python所特有的,但是如果你只存储指向可变对象的指针,那么在爪哇,甚至在C或C++中都可以观察到。在

C++示例(不好C++,但显示问题的最小值)

class pair {
    public:
        int key;
        int val;
}

pair* map[5];

pair p;

for (i=0; i<5; i++) {
    p.key = i;
    p.val = 2 * i;
    map[i] = &p; // only store pointer
}

在循环的末尾map包含5个指向同一个pair和{}和{}的指针

相关问题 更多 >