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



我试图定义一个类Hlist的链表如下:

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, ok。

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相同的方式工作(局部变量),或者它将被绑定到指针a,我调用pop()?在这种情况下,this = this.hlnext是否会改变a指针?

因为self不像你想象的那样工作。self只是另一个局部变量:在pop()中对它赋值不会将对象改变为另一个东西。

这主要是因为你不能直接改变self。
如果你考虑指针,你不能改变指针的地址,除非你在这个指针上使用另一个指针。这里,如果你把self看作一个指针,当你给self赋另一个值时,你并没有真正改变self指针。

查看答案

第二段代码"工作"(不是在所有情况下),因为你没有改变self本身,而是它所指向的引用。然后,您的实例被更新以删除其旧值并使用下一个值更新自身。

相关内容

  • 没有找到相关文章

最新更新