我有一个类的对象列表。更改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}$我已经更改了当前的状态对象,所以它不应该出现在列表中。在
而不是共享一个新的对象。在
像
=
和append
这样的操作共享一个引用,不创建新对象。您可以通过再次调用state()来创建一个新的非重复状态。您可以使用复制模块创建copy:您的
state
对象是可变的。当你调用current_state.addKey(5)
时,你修改了current_state
,但是所有指向它的指针仍然指向它。在python中,list只包含指向对象的指针。对于可变列表,你也有同样的情况:对于字符串,您不能有相同的东西(例如),因为它们是不可变的。不能修改它们,只能指向另一个字符串
^{pr2}$当您在循环之外创建一个对象,并在循环中对其进行修改并将其添加到列表中时,这是一个常见的错误源:在循环的末尾,您有一个列表,其中包含n次具有上一个值的同一对象。这不是Python所特有的,但是如果你只存储指向可变对象的指针,那么在爪哇,甚至在C或C++中都可以观察到。在
C++示例(不好C++,但显示问题的最小值)
在循环的末尾}和{}的指针
map
包含5个指向同一个pair
和{相关问题 更多 >
编程相关推荐