附加到同一列表

时间:2013-02-11 02:01:42

标签: python

我来自一个坚实的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()也改变了第一个列表,那么如何确保每个节点都有自己的副本而不是指向到同一地址?感谢

2 个答案:

答案 0 :(得分:4)

简短回答:

__init__中创建新列表。

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

答案很长:

这与python如何查找属性有关。执行:instance.attribute时,python首先在实例上查找属性。如果在那里找不到它,它会在上查找属性。这里有一个类的列表属性,你继续通过实例附加到该属性。所以,当你有这条线:

self.TermInfo.append(whatever)

Python首先关注自我。但是,self没有TermInfo属性,因此python会在self.__class__属性中查看Node(在这种情况下为TermInfo) - 并且它找到它所以它附加到Node.TermInfo列表。

答案 1 :(得分:0)

只有在__init__和对象构造之后分配的属性才是实例属性。类定义中分配的属性是类属性,类似于其他语言中的静态类成员。因此,如果您想拥有每个实例属性,请在__init__中分配其初始值。