链表中节点的可变性

时间:2013-08-25 22:30:31

标签: python linked-list

我刚刚开始使用Python并且在过去的一小时内一直处于困境:当遍历链表时,通常的方法是执行以下操作:

def traverse(self):
    current = self.head
    while current != None:
        print current.getData()
        current = current.getNext()

我不明白为什么self.head在这里没有变化,因为我们稍后会current = self.headcurrent = current.getNext()self.head是不可变的吗?

1 个答案:

答案 0 :(得分:2)

您只需要分配本地名称(变量);您没有为所涉及的对象的属性分配任何内容。

换句话说,只有current会反弹到不同的对象,但currenttraverse()函数中的本地名称。您绝不会在currentself上分配属性

否则这与可变性无关。

如果您希望行self.head影响current = current.getNext(),那么您可能会误解的行。那一行:

  • getNext
  • 引用的对象上查找current属性
  • 调用生成的对象
  • 将调用结果存储在名称current中,如果之前已绑定,则重新绑定它。

重新绑定只会丢弃之前的引用,因此现在current指向返回的current.getNext()current绑定的上一个对象不会更改。如果在Python中的任何其他位置没有对该先前对象的其他引用,则从内存中清除该对象(已删除)。在链表中,可能是从列表中的上一个对象仍然可以引用它。

您可以将对象视为气球,将名称(变量)视为标签;赋值通过字符串将名称附加到对象。您可以将多个标签附加到任何给定的气球,但给定的标签只能附加到一个气球。然后,重新绑定,只需将标签与标签绑在一起,然后将其重新绑定到另一个气球上。任何没有附加条件的气球都会飞走,永远不会再被看到。