首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >追加到同一列表

追加到同一列表
EN

Stack Overflow用户
提问于 2013-02-11 10:01:42
回答 2查看 85关注 0票数 2

我有扎实的C/C++背景,所以如果我的问题很愚蠢,请容忍我。

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

代码语言:javascript
复制
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

我试着用这种方式操纵它们

代码语言:javascript
复制
 Info = TermInfo(ID,0)
 node = Node(j,Info)
 Dict[j] = node

基本上,我试图构建一个包含由字符串"Term“和"Terminfo”列表组成的节点的字典,我期望每个节点都有自己的副本。但是,在我连续两次调用这三条线路之后,

代码语言:javascript
复制
Info = TermInfo(ID,0)
node = Node(j,Info)
Dict[j] = node

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

我很惊讶地看到两个"TermInfo“列表指向相同的内存地址,第二个append()也更改了第一个列表,那么如何确保每个节点都有自己的副本,而不是指向相同的地址呢?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-11 10:03:51

简短的回答:

__init__中创建一个新列表。

代码语言:javascript
复制
def __init__(self,S,Info):
    self.Term = S
    self.TermInfo = [Info]

长长的答案:

这与python查找属性的方式有关。当您这样做时:instance.attribute首先在实例上查找属性。如果在那里找不到,它将在上查找该属性。在这里,您在类上有一个list属性,并且您一直通过实例附加到该属性。所以当你有了这行字:

代码语言:javascript
复制
self.TermInfo.append(whatever)

Python首先看一看self。但是,self没有TermInfo属性,因此python会在self.__class__ (本例中为Node)中查找TermInfo属性--它会找到该属性并将其附加到Node.TermInfo列表中。

票数 4
EN

Stack Overflow用户

发布于 2013-02-11 10:06:35

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14804921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档