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

2024-04-19 17:46:28 发布

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

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

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


Tags: 对象selfobj内容returnvaluestack堆栈
3条回答

如果需要对象的副本,则需要复制或深度复制对象。看看^{}模块。你知道吗

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

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

查看找到的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    

相关问题 更多 >