Python - 为什么当我调用其他不返回任何内容的函数时,我的本地定义链表会更新



下面的代码从LinkedQfile导入一个链表,并创建一个带有一些节点对象的列表对象。如果我运行此代码,check_something()的输出将变为CD。我认为check_something()中的linked_list将成为函数内的本地对象,由于我不会将返回的内容分配给任何内容,因此它不会更改,也就是说,我希望输出ABCD。显然不是这样,所以我想知道是否有人能向我解释一下这里发生了什么?

如果linked_list是一个全局变量,我希望得到这样的结果,我猜每个函数中的return语句都会向对象返回一些信息,但我不知道如何以及为什么!(我从一篇讲义中得到了代码,它的工作原理就像我想要的一样,我只想知道为什么!)

from LinkedQFile import LinkedQ
def check_something(linked_list):
    check_first_element(linked_list)
    check_second_element(linked_list)
    print(linked_list)
def check_first_element(linked_list):
    word = linked_list.dequeue()
    if word == "A":
        return
def check_second_element(linked_list):
    word = linked_list.dequeue()
    if word == "B":
        return
def main():
    list = LinkedQ()
    list.enqueue("A")
    list.enqueue("B")
    list.enqueue("C")
    list.enqueue("D")
    check_something(list)
main()

如果需要,LinkedQFile:

class Node:
    def __init__(self, x, next= None):
        self._data = x
        self._next = next 
    def getNext(self):
        return self._next  
    def setNext(self, next):
        self._next = next 
    def getValue(self):
        return self._data
    def setValue(self, data):
        self._data = data  

class LinkedQ:
    def __init__(self):
        self._first = None
        self._last = None 
        self._length = 0  
    def __str__(self): 
        s = ""
        p = self._first
        while p != None:
            s = s + str(p.getValue())
            p = p.getNext()
        return s

    def enqueue(self, kort):
        ny = Node(kort)
        if self._first == None: 
            self._first = ny 
        else:  
            self._last = self._first 
            while self._last.getNext():   
                self._last = self._last.getNext()
            self._last.setNext(ny)    
        self._length += 1    
    def dequeue(self): 
        data = self._first.getValue()
        self._first = self._first.getNext()
        self._length = self._length - 1
        return data 

linked_list是一个局部变量是对的,但变量是局部的并不意味着它不能引用非局部的东西。为了让它达到你的预期,每次你把它传递给函数时,它都需要复制你的整个链表,这是没有意义的。

下面是一个简单的例子,说明了共享对象的概念。在本例中,创建了一个空列表并将其分配给a。然后CCD_ 9被分配给CCD_。这不会复制列表。相反,有一个单独的列表,由ab引用。当它被修改时,通过abab都反映了变化:

>>> a = []
>>> b = a
>>> a.append("x")
>>> a
['x']
>>> b
['x']
>>>

同样的事情也发生在类对象上。事实上,如果你的链接列表不起作用,它就根本不起作用。

相关内容

  • 没有找到相关文章

最新更新