【问题标题】:Python : why doesn't a.pop() modify the list (custom linked-list class)Python:为什么 a.pop() 不修改列表(自定义链表类)
【发布时间】:2016-09-28 13:39:24
【问题描述】:

我正在尝试定义一个链表类 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 - 无,好的。那么

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 指针?

【问题讨论】:

    标签: python pointers linked-list


    【解决方案1】:

    因为self 的工作方式与您想象的不同。 self 只是另一个局部变量:在 pop() 内分配给它不会将对象更改为另一个对象。详情请见this question

    【讨论】:

    【解决方案2】:

    这很糟糕,因为你不能直接改变自我。
    如果您考虑指针,则无法更改指针地址,除非您在此指针上使用指针。这里,如果你把 self 看成一个指针,当你给 self 赋值另一个值时,你并没有真正改变 self 指针。

    See this answer

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

    【讨论】:

    • 所以实际上,self.hlnext 是存在于函数外部(在实例中)的指针,而 selfa 的副本?
    • 在 python 中,我们将引用称为 java。所以self.hlnext是一个存在于函数之外的引用,只要你使用实例来获取它。 self 不是a 的真正副本,它是a,但你不能修改它的引用。 (如果您深入了解元编程,您会发现可以通过自己传递 self 参数来调用 Python 中的任何实例方法。)
    猜你喜欢
    • 2012-06-04
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多