2014-09-05 73 views
0

我的問題是在del_node方法,儘管設置self = self.next,這似乎沒有影響正在進行調用的類的實例。Python方法不影響類的實例

例如 如果我有一個鏈表L = 1 - > 2 - > 3 - > 4

主叫L.del_node(x),其中x是任何節點比所述第一其他, 簡單地使呼叫這樣將工作,但是,如果我打電話給 L.del_node(1)我要稱呼其爲L = L.del_node(1);我假設這必須做 與不改變的情況下的任何值,因爲我與其他人(如復位 self.data/next,等等)。

我問,因爲我很困惑,爲什麼聲明self = self.next似乎並沒有影響 實例時self.data = ...一樣。

class Node(): 

    def __init__(self,data = None): 
     self.data = data 
     self.next = None 

    def add_node(self,data): 

     if self.data == None: 
      self.data = data 

     else: 
      while self.next != None: 
       self = self.next 
      self.next = Node(data) 


    def del_node(self,data): 

     if self.data == None: 
      print "ERROR: Null list" 
      return self 

     elif self.data == data: 
      if self.next == None: 
       self.data = None 
       return self 
      else: 
       #this seems to be the only case where 
       #instance = instance.del_node() matters (why?) 
       #opposed to just instance.del_node() 
       return self.next 

     start = self 
     prev = self 
     self = self.next 

     while self.next != None: 
      if self.data == data: 
       prev.next = self.next 
       return start 
      prev = self 
      self = self.next 

     if self.data == data: 
      prev.next = None 
      return start 
     else: 
      print "ERROR: value not in list" 
      return start 

    def get_len(self): 
     length = 0 
     if self.data == None: 
      return length 

     while self.next != None: 
      length += 1 
      self = self.next 
     return length + 1 

    def __str__(self): 

     string = '' 

     while self.next != None: 
      string += str(self.data) + ' -> ' 
      self = self.next 
     return string + str(self.data) 
+0

如果你想滾動你自己的鏈表,你需要存儲列表的開始。另外,儘管可以使用self變量遍歷列表,但它的格式很糟糕 - 使用不同的變量名稱,例如currentNode或其他。如果您正在學習數據結構,它可以幫助繪製圖片。 – pwray 2014-09-05 00:43:06

回答

3

self = something不改變對象。就像Python中的其他地方一樣,它只是重新綁定本地名稱self。 (關於名稱self這個名字沒有什麼特別之處 - 它只用於慣例,一個方法只是一個普通的函數,self只是一個普通的參數,它就是如何通過self。)

+0

是不是自指針,該類的實例的指針進行調用?無論如何,如果我重置自我.___ =某事,我改變了這個類的實例;然而,如果我只是設置self = ____,它似乎沒有影響外的方法。這是令我困惑的。希望這是有道理的,謝謝。 – razeal113 2014-09-05 00:29:37

+0

'self'是該方法被調用的對象。變量'self'對它沒有什麼特別之處 - 就像任何其他局部變量一樣。分配給它只是重新綁定本地名稱。 – 2014-09-05 01:19:36

+0

http://nedbatchelder.com/text/names.html可能會讓你感興趣 – 2014-09-05 01:20:16

相關問題