包含自动更改对象的Python堆栈

时间:2013-02-20 05:23:41

标签: python stack

我在Python中使用了以下堆栈类来存储另一个类的对象。

class Stack :
 def __init__(self) :
   self.items = []

 def push(self, item) :
   self.items.append(item)

 def pop(self) :
   return self.items.pop()

 def isEmpty(self) :
   return (self.items == []) 
scopeStack=Stack();
object1=AnotherClass();
object1.value=2;
scopeStack.push(object1);

在堆栈外部更改对象object1的内容时,堆栈对象的内容也发生了变化。

 object1.value=3;
 obj=scopeStack.pop();
 print obj.value; #gives output 3

我应该怎么做才能在局部变量和堆栈的内部变量之间进行动态绑定?

3 个答案:

答案 0 :(得分:3)

查看找到的copy模块here。您要找的是copy.deepcopy()

示例:

class Obj:
    def __init__(self, value):
        self.value = value

x = Obj(5)
y = copy.deepcopy(x)

print 'x:', x.value
print 'y:', y.value

x.value = 3

print 'x:', x.value
print 'y:', y.value

输出:

x: 5
y: 5
x: 3
y: 5    

答案 1 :(得分:2)

它不是动态绑定,只是对同一个对象的多个引用。当你执行scopeStack.push(object1)时,将该对象推送到堆栈上 - 不是对象的名称,或对象的内容,而是对象本身。如果您以后修改该对象,它的修改将显示在有引用的任何地方。

如果您希望堆栈上的版本是独立的,那么您需要复制它并推送副本。您可以尝试使用copy模块,但如果您的对象是自定义类的实例,则可能需要为该类编写自己的复制机制。 Python无法自动知道如何复制您创建的任何自定义类的实例。

答案 2 :(得分:1)

如果需要对象的副本,则需要复制或深度复制对象。查看copy模块。