2

我来自扎实的 C/C++ 背景,所以如果我的问题很愚蠢,请多多包涵。

这里我有两个声明封装数据的类,

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”列表组成的节点,我希望每个节点都有自己的副本。但是,在我连续两次调用这三行之后

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

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

我惊讶地发现“TermInfo”的两个列表都指向同一个内存地址,而第二个 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 回答