我试图定义一个链表类列表,如下所示:
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
指针?你知道吗
因为
self
不是你想象的那样。self
只是另一个局部变量:在pop()
内赋给它不会把对象变成另一个东西。详见this question。你知道吗这是因为你不能直接改变自己。
如果考虑指针,就不能更改指针地址,除非在此指针上使用指针。在这里,如果您将self视为一个指针,那么当您将另一个值赋给self时,就不会真正更改self指针。你知道吗
See this answer
第二个代码“起作用”(并非在所有情况下),因为您没有改变自我本身,而是它所指向的引用。然后更新实例以删除其旧值,并使用下一个值更新自身。你知道吗
相关问题 更多 >
编程相关推荐