2

ファイルと IO デバイスからリストを生成するためのいくつかのメソッドと共に、構造化データ項目のリストを生成するクラスを作成しようとしています。

新しいデータ構造を入力してリストに追加するメソッドに問題があります。(yield) 関数からのデータで一時構造を埋めるコルーチンとしてセットアップされます。完了すると、データがリストに追加されます (例: self.list.append(newdata))。私の問題は、この追加が参照によって行われ、newdata を新しいメモリ空間に初期化する方法がわからないことです。結局、すべて同じデータ構造を指しているデータのリストがあります (たとえば、「myclass.list[n] is myclass.list[m]」は常に TRUE になります)。誰かがこれを機能させる方法を教えてもらえますか?

C++ で書いていたら、「newdata = new * mydatastructure;」を実行するだけで済みます。各ループ反復の後...私はPythonでこれを行う方法を理解できません....私はここでコースから外れていますか?

4

2 に答える 2

3

newのシンタックスシュガーですmydatastructure* = malloc(sizeof(mydatastructure));(またはそのようなもの、それはしばらく前です)。What-have-you のヒープに適切な量のメモリを割り当て、(C++ で) コンストラクタを使用すると、メモリが初期化されます。

Python がこれを処理します。__new__技術的には、割り当てを制御すると呼ばれる同様のルーチンが Python にあります。ただし、オブジェクトでこれをオーバーライドする必要はほとんどありません。

Python オブジェクトのコンストラクタは と呼ばれ__init__ます。を呼び出すと__init____new__実際には最初に呼び出されます。そのため、Python でオブジェクトを作成すると、自動的に新しいメモリが割り当てられ、それぞれが異なります。Benjamin が指摘したように、コンストラクター構文 ( ) は、実際に入力せずにfoo = Foo()呼び出す方法です。__init____init__()

残念ながら、問題はコードの他の場所にあります。

ところで、2 つの変数が同じオブジェクトを参照していることを本当に確認したい場合は、id()関数を使用して参照番号を取得できます。オブジェクトのメソッドを使用してそれらを比較する演算子とはis対照的に、キーワードはこれらの参照番号を比較します。==__eq__

于 2013-08-05T18:46:18.717 に答える
2

私の問題は、この追加が参照によって行われ、newdata を新しいメモリ空間に初期化する方法がわからないことです。

オブジェクトを値によってリストに追加しようとしている場合は、copy.copy や copy.deepcopyなどを使用して、追加されているものが確実にコピーされるようにすることができます。

>>> # The Problem
>>> class ComplexObject:
...     def __init__(self, herp, derp):
...         self.herp = herp
...         self.derp = derp
...
>>> obj = ComplexObject(1, 2)
>>> list = []
>>> list.append(obj)
>>> obj.derp = 5
>>> list[0].derp
5
>>> # obj and list[0] are the same thing in memory
>>> obj
<__main__.ComplexObject instance at 0x0000000002243D48>
>>> list[0]
<__main__.ComplexObject instance at 0x0000000002243D48>
>>> # The solution
>>> from copy import deepcopy
>>> list = []
>>> obj = ComplexObject(1,2)
>>> list.append(deepcopy(obj))
>>> obj.derp = 5
>>> list[0].derp
2
>>> obj
<__main__.ComplexObject instance at 0x0000000002243D48>
>>> list[0]
<__main__.ComplexObject instance at 0x000000000224ED88>

これは、コードを見ずに、説明から実際に問題を解決しようとする私の試みです。Python の割り当て/コンストラクターにもっと興味がある場合は、別の回答を参照してください。

于 2013-08-05T18:26:46.353 に答える