問題タブ [deep-copy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - いくつかのクラスでの ICloneable の実装のドライ化
クローン可能にしたいいくつかの異なるクラスがあります: GenericRow
、GenericRows
、ParticularRow
、およびParticularRows
。次のクラス階層があります。 GenericRow
は の親でありParticularRow
、GenericRows
は の親ですParticularRows
。ICloneable
各クラスのインスタンスのディープ コピーを作成できるようにするために、各クラスを実装します。Clone()
各クラスでまったく同じコードを書いていることに気づきました。
次に、次のような便利なラッパー メソッドを提供しますGenericRows
。
コードは非常に小さく、戻り値の型、キャストなどによってクラスごとに異なるため、各クラスでほぼ同じように見える便利なラッパーメソッドで問題ありません。ただし、 4つのクラスすべてICloneable.Clone()
で同じです。これを何らかの形で抽象化して、1 か所だけで定義することはできますか? 私の懸念は、ユーティリティ クラス/object
拡張メソッドを作成した場合、コピーしたい特定のインスタンスのディープ コピーが正しく作成されないことでした。とにかくこれは良い考えですか?
python - 辞書のコピーと SQLAlchemy ORM オブジェクトでの deepcopy の使用に関する問題
学生とプロジェクトの特定の割り当てを最適化するために、シミュレーテッド アニーリング アルゴリズムを実行しています。
これは、Wikipedia の言語に依存しない疑似コードです。
以下は、テクニックの適応です。私の上司は、そのアイデアは理論的には問題ないと言いました。
最初に、ランダム化された割り当てのセット全体からいくつかの割り当て (つまり、プロジェクトのランクを含む、学生と割り当てられたプロジェクトの辞書全体) を取得し、それをコピーして関数に渡します。この割り当てを呼び出しましょうaOld
(辞書です)。aOld
と呼ばれるそれに関連する重みがありwOld
ます。重み付けについては後述します。
この関数は次のことを行います。
- この割り当て
aOld
をbest_node
- すべての生徒からランダムな数の生徒を選び、リストに貼り付けます
- それらのプロジェクトを削除 (DEALLOCATE) ++ プロジェクト (
allocated
パラメーターは nowFalse
) と講師の変更を反映 (1 つ以上のプロジェクトが割り当てられなくなった場合はスロットを解放) - そのリストをランダム化する
- そのリスト プロジェクトの全員を再度割り当て (REALLOCATE) してください。
- 重みを計算します (ランクを合計します。ランク 1 = 1、ランク 2 = 2... およびプロジェクトなしのランク = 101)。
- この新しい割り当て
aNew
では、重みが最初に選択しwNew
た割り当ての重みよりも小さい場合、これは (上記のアルゴリズムで定義された) です。アルゴリズムを適用して続行します。wOld
best_node
Simulated Annealing
aNew
- の場合
wOld < wNew
、アルゴリズムをaOld
再度適用して続行します。
割り当て/データポイントは、「ノード」として表現されます。node = (weight, allocation_dict, projects_dict, lecturers_dict)
現時点では、このアルゴリズムは 1 回しか実行できませんが、数値 N (kmax
ウィキペディアのスニペットでは で示されています) を試して、以前node
の とbest_node
.
元の辞書 (リセットしたいかもしれません) を変更しないように、辞書の浅いコピーを作成しました。ドキュメントで読んだことから、参照をコピーするだけのようで、辞書にはオブジェクトが含まれているため、コピーされた辞書を変更するとオブジェクトが変更されます。copy.deepcopy()
これらの辞書は、SQLA でマップされたオブジェクトを参照します。
Questions:
私は直面している問題に対していくつかの解決策を与えられてきましたが、Python を使用することに対する私の環境への配慮のせいで、それらはすべて私にはやや不可解に聞こえます。
Deepcopy は SQLA とうまく連携していません。ORM オブジェクトのディープコピーにはおそらく問題があり、期待どおりに動作しないと言われています。どうやら、「コピー コンストラクター、つまり def copy(self): return FooBar(....) を作成する」ほうがよいようです。誰かがそれが何を意味するのか説明してもらえますか?
deepcopy
SQLAlchemy がオブジェクトに余分な情報を配置するため、問題があることがわかりました。つまり_sa_instance_state
、コピーには入れたくないが、オブジェクトに必要な属性です。「古いものを手動で吹き飛ばして_sa_instance_state
新しいものをオブジェクトに付ける方法はありますが、最も簡単なのは、新しいオブジェクトを作成して、__init__()
重要な属性を設定することです。ディープコピー。」それは正確にはどういう意味ですか?古いマップされたクラスに似た、マップされていない新しいクラスを作成する必要がありますか?別の解決策は、「オブジェクトに実装
__deepcopy__()
し、新しい _sa_instance_state が設定されていることを確認する必要があります。それを支援できる関数が sqlalchemy.orm.attributes にあります。」繰り返しますが、これは私を超えているので、誰かが親切にそれが何を意味するのか説明できますか?より一般的な質問:上記の情報が与えられた場合、
best_node
(whileループを通じて常に持続する必要がある)およびprevious_node
実際のオブジェクト(辞書によって参照されるため、ノードの場合)の情報/状態を維持する方法に関する提案はありますか) が行われているため、割り当て解除/再割り当てが変更されていますか? つまり、コピーを使用せずに?
.net - IronPython のディープコピー
IronPythonでdeepcopyをしたいのですが、書くと
私は得るno module named copy
。
IronPython でディープコピーするにはどうすればよいですか?
python - Pythonでディープコピーを「オーバーライド」するにはどうすればよいですか?
特定の SQLAlchemy マップされたクラスをオーバーライド__deepcopy__
して、SQLA 属性を無視し、クラスの一部である他のすべてをディープコピーしたいと考えています。
特に Python の組み込みオブジェクトをオーバーライドすることには特に詳しくありませんが、何が必要かについてはある程度の考えがあります。
User
SQLA を使用してマップされる非常に単純なクラスを作成しましょう。
dir()
マッピングの前後に、どの SQLAlchemy 固有の属性があるかを確認していましたが_sa_class_manager
、_sa_instance_state
.
Questions
それらが唯一のものである場合、定義するときにそれをどのように無視し__deepcopy__
ますか?
また、SQLA がマップされたオブジェクトに挿入する属性はありますか?
(私は以前の質問でこれを尋ねました(ただし、主な質問への回答を選択した数日後の編集として)が、そこで電車に乗り遅れたと思います。そのことをお詫びします。)
Edit - Fixed code thanks to zifot's answer
memo
私が Python ドキュメントから得た唯一のことは、追加の引数としてdeepcopy を定義する必要があるということです。少し掘り下げた後、私はこれを試しました:
次に、次のようにインスタンスを作成しましたUser
。
その後、次のようにdeepcopy
操作 を試みました。
...そしてsnake_dc
まだSQLA属性が含まれています...
私はすべて、助け、提案などを受け入れます。
python - deepcopy と python - 使用を避けるためのヒントは?
私は、約20,000の緯度、経度座標のリストを循環し、各点から基準点までの距離を計算する、非常に単純なpythonルーチンを持っています。
私は当初、まったく同じアプローチを使用してこれを C で作成しました。そこでは問題なく動作し、nPoints<=100 の場合は基本的に瞬時です。SqlAlchemy を使って他のことをしたかったので、Python に移植することにしました。
私は最初にメソッドをペッパーするディープコピーステートメントなしでそれを移植しました。これにより、結果が「奇妙」または部分的に正しくなくなりました。それでも、C バージョンとほぼ同じ速さでした。
deepcopy 呼び出しが追加されたので、ルーチンは正しく機能しますが、極端にパフォーマンスが低下し、同じ機能を実行するのに数秒かかります。
これはかなり一般的な仕事のように思えますが、私は明らかに Pythonic の方法でそれを行っていません。正しい結果が得られるが、どこにでもディープコピーを含める必要がないようにするには、どうすればよいですか?
編集:
私ははるかにシンプルで高速なソリューションを見つけました。
したがって、基本的には、入力の完全なコピーを作成し、新しい値 (基準点からの距離) を追加するだけです。次に、結果のリストに「sorted」を適用し、ソート キーが PointDistance オブジェクトの距離プロパティになるように指定します。
理由はよくわかりませんが、これは deepcopy を使用するよりもはるかに高速です。私はそれが効率的な C 実装の python の「ソート済み」にかかっていると思いますか?
silverlight - コレクション内のオブジェクトからオブジェクト プロパティへのマッピング
Silverlight グリッドに表示する (動的に生成された型) のコレクションを作成しています。プロセスの 1 つは、インポート (動的に生成された型) 型を作成し、インポート型のプロパティを (動的に生成された型) 両方の型のコレクションにマッピングすることです。アイテムを識別する Id プロパティを共有します (グリッド上またはインポート内で)
つまり、グリッドにバインドされたタイプ
タイプをインポートします
ID が一致する場所に foo をコピーします。
コレクション内のあるタイプから別のタイプにプロパティをマップする簡単な方法は何ですか?
編集
Stephan のおかげで Typemapper の最終的な実装を次に示します。この機能は、キーメンバーが等しい場合にのみ 2 つの型をマップします。メンバー名を表す辞書文字列文字列を介して定義されたマッピングは、silverlight で機能します。
java - Javaオブジェクトコピーの最良のオプション?
重複の可能性:
Java でオブジェクトをコピーするにはどうすればよいですか?
Java でオブジェクトをコピーする必要があります (つまり、オブジェクトを「参照ではなく値で」コピーして、新しいオブジェクトが古いオブジェクトへの単なる参照にならないようにします)。私はクローン可能の実装にうんざりしていて、コピー コンストラクターを使用したいと考えています。ただし、コピーする必要があるクラスには、コピーする必要がある多くのメンバー変数 (100 以上) があるため、コピーするためだけに新しいコンストラクターをクラスに追加する (これはアプリケーションの 1 つの部分でのみ必要です) のは不十分な解決策のようです。その巨大な長さのために。
より良い解決策はありますか?clone() を使用する必要がありますか? コピー コンストラクターを作成できますが、すべてのフィールドを 1 つずつコピーするのではなく、リフレクティブにコピーできますか? ありがとう。
基本的には、古いオブジェクトと同じ新しいオブジェクトを作成する必要がありますが、いくつか (100 のうち約 10) のフィールドが変更されています (ただし、まだ両方のオブジェクトが必要です..そのため、新しいオブジェクトは古いもの)。私はどんな提案にもオープンです。
gdi+ - オブジェクトのライブラリ - アクセス インデックス値またはオブジェクト自体? (たとえば、深いコピーと浅いコピーの違いは?)
.Net が参照をコピーする方法について、私は常に混乱/不確かでした。GDI+ 用の Bitmap オブジェクトがあるとします。
「Foo」はビットマップ オブジェクトを保持します。今、私がこれをするとしましょう。
これは浅いコピーですか、それとも深いコピーですか? foo を何も設定しない場合、bar も突然「何もない」を参照しますか? または、バーにはビットマップのコピーも含まれていますか?ビットマップをメモリから完全に削除するには、「foo」と「バー」の両方を何も設定する必要がありますか?
ビットマップのライブラリをメモリに保持する必要があります。インデックスを使用してコーディングし、毎回ライブラリを参照するよりも、作成された各オブジェクトの各ビットマップへの参照を変数として格納する方が簡単です。必要です (「BitmapLibrary.Singleton.getBitmap(id)」など)
一言で言えば、私はこれを行うことができます:
これの代わりに:
ruby - Rubyでオブジェクトのディープコピー/クローン作成用のオペレータを作成するには?
新しい演算子を導入することで、次のことを実現したいと思います(例:=
)
私が理解している限り、Object
クラスを変更する必要がありますが、必要なものを取得するために何をすべきかわかりません。
これで私を助けてもらえますか?
アップデート
わかりました、スーパーエーターはおそらくここでは役に立ちませんが、それでもそのようなオペレーターが必要です。モジュールとしてロードできる Ruby の拡張機能を作成するにはどうすればよいですか?
java - CXF:wsdl2javaからのクローン可能なクラス?
CXFのwsdl2javaにクローン可能なクラスを発行させることは可能ですか?たぶん、いくつかのオプションまたはプラグインを介して?
私がする必要があるのは、あるオブジェクトツリーから別のオブジェクトツリーにかなり複雑なスキーマ構造を値でコピーすることであり、各メンバーの値を手動で取得/設定したり、生成されたクラスに手動で触れたりすることはありません。
/Björn