2013-08-25 77 views
0

我剛開始使用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是不可變的嗎?

+2

【關於Python名稱和值的事實和神話】(http://nedbatchelder.com/text/names.html) – delnan

回答

2

您只能分配給本地名稱(變量);你沒有爲涉及的對象的屬性分配任何東西。

換句話說,只有current被反彈到不同的對象,但currenttraverse()函數中的本地名稱。您在任何時候都沒有將屬性分配到currentself

這與可變性沒有任何關係。

如果您預計self.head由線current = current.getNext(),那麼你或許誤解是什麼線確實受到影響。該行:

  • 查找由current
  • 引用的對象上getNext屬性調用生成的對象
  • 存儲在名稱current通話,重新綁定,如果它之前必然的結果。

重新綁定只是丟棄了以前的參考,所以現在current指向返回的任何current.getNext()。否則不會改變current所綁定的前一個對象。如果在Python的其他地方沒有其他引用,那麼該對象將從內存中清除(刪除)。在一個鏈表中,大概仍然會從列表中的前一個對象引用它。

你可以看到對象爲氣球,名稱(變量)作爲標籤;賦值通過字符串將名稱附加到對象。您可以將多個標籤附加到任何給定的氣球,但給定的標籤只能附加到一個氣球。然後,重新綁定簡單地將綁定標籤的字符串切割成氣球,然後將其重新命名爲另一個氣球。任何沒有附加字符串的氣球都會飛走,永遠不會再被看到。