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 に答える