好,所以我在玩链接列表。我真的不知道为什么它不起作用。有人可以解释为什么吗?
不用理会插入部分,让我们看一下removeFirst(更简单)。
class Node():
def __init__(self, data = None):
self.data = data
self.next = None
class Link():
def __init__(self):
self.head = None
def insertFirst(self, data_n):
node = Node(data_n)
head = self
node.next = head.head
head.head = node
def display(self):
head = self.head
while head != None:
print(head.data, end = '->')
head = head.next
print()
def removeFirst(self):
head = self.head
head = head.next
以下代码无效。
def removeFirst(self):
head = self.head
head = head.next
但是,这个有效。
def removeFirst(self):
#head = self.head
self.head = self.head.next
有人可以帮我吗?
答案 0 :(得分:1)
def removeFirst(self):
head = self.head
head = head.next
您创建一个局部变量head
,该变量的值是self.head
,然后是值head.next
。
这就是这两行。
def removeFirst(self):
self.head = self.head.next
您将self.head.next
的值绑定到head
的{{1}}属性中。所以现在self
等于self.head
。
看起来您的困惑来自于以下事实:在其他常见的面向对象语言中,成员范围是整个类,例如,如果您在C#的self.head.next
类中有一个head
成员,或者Java,那么任何实例方法中的Link
都将直接引用head
。
好吧,在Python中,事情并非如此,这就是为什么我们将this.head
传递给实例方法的原因。
如果要对实例的成员执行操作,则必须在其前面加上self
。
答案 1 :(得分:0)
代码
head = self.head
head = head.next
首先创建对self.head
当前引用的对象的新引用(我们称其为对象A
)。然后,将head
重新分配为指向A.next
。结果是self.next
完全不受影响,仍然指向A
。与您提供的替代构造不同。
答案 2 :(得分:0)
第一个函数只是分配self.head
的值,然后将head.next
的值分配给head
def removeFirst(self):
head = self.head
head = head.next
相当于...
self.head = 1
head.next = 2
x = 1
x = 2
什么都不做
第二个函数实际上将元素放在head旁边,并将其设为新的head,旧的head被垃圾回收了! p>
def removeFirst(self):
#head = self.head
self.head = self.head.next
所以如果列表更早
self.head self.head.next
1 -----------> 2
列表更改为
self.head
2