1

我在 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

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

4

3 回答 3

3

查看在此处copy找到的模块。您要查找的内容称为.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    
于 2013-02-20T05:31:12.613 回答
2

它不是动态绑定,它只是对同一个对象的多个引用。当您这样做时scopeStack.push(object1),您将该对象压入堆栈——不是对象的名称或对象的内容,而是对象本身。如果您稍后修改该对象,其修改将显示在任何引用它的地方。

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

于 2013-02-20T05:27:53.180 回答
1

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

于 2013-02-20T05:28:33.320 回答