Python方法不影响Class的实例

时间:2014-09-05 00:15:23

标签: python

我的问题是在del_node方法中,尽管设置了self = self.next,但这似乎对正在进行调用的类的实例没有影响。

例如,

如果我有一个链表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)

1 个答案:

答案 0 :(得分:3)

self = something不会更改对象。就像Python中的其他地方一样,它只是重新绑定本地名称self。 (关于名称self,Python并没有什么特别之处 - 它只被惯例使用。方法只是一个普通的函数而self只是一个普通的参数。它是如何通过self传递的。)