Python:a.pop()为什么不修改列表(自定义linkedlist类)

2024-09-30 08:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图定义一个链表类列表,如下所示:

class Hlist:

def __init__(self, value, hlnext):
    self.value = value
    self.hlnext = hlnext

def pop(self):
    res = self.value
    if not(self.hlnext == None):
        self = self.hlnext
    return res

def __repr__(self):
    return (str(self.value) + ' - ' +  str(self.hlnext))

当我在上测试pop()方法时

a = Hlist(1, Hlist(2, None))

Python返回1-2-None,好的。那么

a.pop()

返回1,很好。但是:

print(a)

返回1-2-无。尽管如此,该列表尚未修改

self = self.hlnext

self是指针a还是另一个指针指向与a相同的地址? 为什么下面的代码返回pop()的预期答案:

class Hlist:

def __init__(self, value, hlnext):
    self.value = value
    self.hlnext = hlnext

def pop(self):
    res = self.value
    if not(self.hlnext == None):
        self.value = self.hlnext.value
        self.next = self.hlnext.hlnext
    return res

def __repr__(self):
    return (str(self.value) + ' - ' +  str(self.hlnext))

是因为python使用了setattr函数吗?你知道吗

实际上,我正试图在Python中获得Java中以下类的等效值:

class Hlist{
    int value;
    Hlist hlnext;

    Hlist(int value,Hlist hlnext){
        value = value;
        hlnext = hlnext;
    }
}

并向其添加pop()方法。在pop()方法中,Java的this工作方式是否与Python的self(局部变量)相同,还是将其绑定到我称为pop()的指针?在这种情况下,this = this.hlnext是否会更改a指针?你知道吗


Tags: 方法selfnone列表returnvaluedefres
2条回答

因为self不是你想象的那样。self只是另一个局部变量:在pop()内赋给它不会把对象变成另一个东西。详见this question。你知道吗

这是因为你不能直接改变自己。
如果考虑指针,就不能更改指针地址,除非在此指针上使用指针。在这里,如果您将self视为一个指针,那么当您将另一个值赋给self时,就不会真正更改self指针。你知道吗

See this answer

第二个代码“起作用”(并非在所有情况下),因为您没有改变自我本身,而是它所指向的引用。然后更新实例以删除其旧值,并使用下一个值更新自身。你知道吗

相关问题 更多 >

    热门问题