我刚刚开始使用Python并且在过去的一小时内一直处于困境:当遍历链表时,通常的方法是执行以下操作:
def traverse(self):
current = self.head
while current != None:
print current.getData()
current = current.getNext()
我不明白为什么self.head
在这里没有变化,因为我们稍后会current = self.head
和current = current.getNext()
。 self.head
是不可变的吗?
答案 0 :(得分:2)
您只需要分配本地名称(变量);您没有为所涉及的对象的属性分配任何内容。
换句话说,只有current
会反弹到不同的对象,但current
是traverse()
函数中的本地名称。您绝不会在current
或self
上分配属性。
否则这与可变性无关。
如果您希望行self.head
影响current = current.getNext()
,那么您可能会误解行的行。那一行:
getNext
current
属性
current
中,如果之前已绑定,则重新绑定它。重新绑定只会丢弃之前的引用,因此现在current
指向返回的current.getNext()
。 current
绑定的上一个对象不会更改。如果在Python中的任何其他位置没有对该先前对象的其他引用,则从内存中清除该对象(已删除)。在链表中,可能是从列表中的上一个对象仍然可以引用它。
您可以将对象视为气球,将名称(变量)视为标签;赋值通过字符串将名称附加到对象。您可以将多个标签附加到任何给定的气球,但给定的标签只能附加到一个气球。然后,重新绑定,只需将标签与标签绑在一起,然后将其重新绑定到另一个气球上。任何没有附加条件的气球都会飞走,永远不会再被看到。