0

こんにちは: これはこの質問のフォローアップです:

すべてのpythonインスタンスを新しいクラスにコピーするには?

問題はdeepcopy()、オブジェクトを正しくコピーしていないことです。これは、次の作業コードで確認できます。

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout

class MyApp(App):
    def build(self):
        global Myroot    
        self.root = FloatLayout()
        Myroot = self.root
        Starthere(None)

        return

class VarStorage:
    pass

VS=VarStorage()
from kivy.uix.button import Button
import copy

def Starthere(instance):
    VS.MyButton=Button()
    print str(VS.MyButton)
    VSCopy=copy.deepcopy(VS)
    print str(VSCopy.MyButton)

MyApp().run()

コピーの私の理解から、同じボタンを 2 回印刷する必要がありますが、結果は次のようになります。

<kivy.uix.button.Button object at 0x046C2CE0>
<kivy.uix.button.Button object at 0x04745500>

deepcopy()新しい (存在しない) オブジェクトの代わりに同じオブジェクトをコピーする方法は? ありがとうございました!

- - - - - - - - - - - 編集 - - - - - - - - - - - - - - --

copy()の代わりに試した後deepcopy()、それは私がしようとしていることではありません:

私が得るものdeepcopy()

  • VS のコピーされたクラス。オブジェクトではないアイテムがコピーされます (たとえば、VS.text="text" の場合、VSCopy.text はまったくリンクされずに同じ内容になります)。
  • しかし、オブジェクトの場合、必要なのはそのようなオブジェクトへの参照のコピーですが、新しいオブジェクトの新しい参照ポイントを取得するため、取得できません。

私が得るものcopy()

  • 元のクラス VS を指す参照を使用してクラス VSCopy をコピーしました。私はVSの内容を変更したいので(それが私がそれをコピーしようとしている理由です)、元の内容をVSCopyで利用できるようにしたいので、これは必要ありません。

コピーモジュールにそのような機能はありますか?

4

3 に答える 3

3

shallowcopyの代わりに使用する必要がありますdeepcopyコピー モジュールのドキュメントから:

  • 浅いコピーは、新しい複合オブジェクトを構築し、(可能な範囲で) オリジナルで見つかったオブジェクトへの参照を挿入します。
  • ディープ コピーは、新しい複合オブジェクトを構築し、再帰的に、元のオブジェクトで見つかったオブジェクトのコピーを挿入します。

浅いコピーcopy.copy()を作成するために使用できます:

VSCopy = copy.copy(VS)
于 2013-07-21T13:56:30.930 に答える
2

コピーモジュールにそのような機能はありますか?

いいえ、残念ながらありません。

ある種のハイブリッドの深い/浅い動作が必要なようですが、それはcopyモジュールに存在するものではありません。浅いコピーまたは深いコピーのいずれかを取得します。

悪い知らせで申し訳ありません。:) 独自のコピー機を作成したいだけかもしれませんし、それ自体をコピーせずにタスクを達成できるかどうかを確認したいかもしれません。

(あなたがあなたの質問を編集したのを見たので、私が助けることができるかどうかを確認するためにもう一度回答しました. (元の質問への回答については、私の最初の回答を参照してください.))

于 2013-07-21T15:50:04.707 に答える
1

deepcopy期待どおりに動作しています (VarStorage をディープコピーできると仮定します)。ボタンの文字列表現に混乱しているかもしれません。

オブジェクトをディープコピーすると、(定義により) 新しいメモリ アドレスが割り当てられます。

これ:

<kivy.uix.button.Button object at 0x046C2CE0>

メモリ位置 0x046C2CE0 に Button オブジェクトがあることを意味します。

この:

<kivy.uix.button.Button object at 0x04745500>

メモリ位置 0x04745500 にの Button オブジェクトがあることを意味します。最初のボタンの新しいコピーです。

おそらく (私はそうは思いませんが) 実際に浅いコピー ( copy.copy) が必要ですか?

于 2013-07-21T13:58:30.360 に答える