2

私は確かな C/C++ のバックグラウンドを持っているので、私の質問がばかげている場合はご容赦ください。

ここには、データをカプセル化するように宣言された 2 つのクラスがあります。

class Node:
    Term = ""
    TermInfo = []
    def __init__(self,S,Info):
        self.Term = S
        self.TermInfo.append(Info)

class TermInfo:
    DocID = 0
    Freq = 0
    def __init__(self,ID,F):
        self.DocID = ID
        self.Freq = F

そして、私はそれらをこのように操作しようとしていました

 Info = TermInfo(ID,0)
 node = Node(j,Info)
 Dict[j] = node

基本的に、文字列「Term」と「Terminfo」のリストで構成されるノードを含む辞書を構築しようとしていましたが、各ノードには独自のコピーがあると予想していました。ただし、3行に2回続けて電話した後

Info = TermInfo(ID,0)
node = Node(j,Info)
Dict[j] = node

Info = TermInfo(ID,0)
node = Node(j,Info)
Dict[j] = node

「TermInfo」の 2 つのリストが同じメモリ アドレスを指していて、2 番目の append() も最初のリストを変更したことに驚きました。では、各ノードが同じメモリ アドレスを指すのではなく、独自のコピーを持っていることを確認するにはどうすればよいでしょうか。住所?ありがとう

4

2 に答える 2

4

簡潔な答え:

で新しいリストを作成します__init__

def __init__(self,S,Info):
    self.Term = S
    self.TermInfo = [Info]

長い答え:

これは、python が属性を検索する方法に関係しています。すると instance.attribute、python は最初にインスタンスの属性を探します。そこに見つからない場合は、classの属性を探します。ここでは、クラスにリスト属性があり、インスタンスを介してその属性に追加し続けます。したがって、次の行がある場合:

self.TermInfo.append(whatever)

Python はまず自分自身を調べます。ただし、属性selfがないTermInfoため、python はself.__class__(Nodeこの場合は)TermInfo属性を調べます。それが見つかったので、Node.TermInfoリストに追加します。

于 2013-02-11T02:03:51.420 に答える
0

オブジェクトの構築中および構築後に割り当てられた属性のみ__init__がインスタンス属性です。クラス定義で割り当てられた属性はクラス属性であり、他の言語の静的クラス メンバーに似ています。したがって、インスタンスごとのアトリビュートが必要な場合は、その初期値を に割り当てます__init__

于 2013-02-11T02:06:34.950 に答える