2014-09-05 75 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

相关问题