我试图定义一个类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本身,而是它所指向的引用。然后,您的实例被更新以删除其旧值并使用下一个值更新自身。