下面的代码从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_。这不会复制列表。相反,有一个单独的列表,由a
和b
引用。当它被修改时,通过a
或b
,a
和b
都反映了变化:
>>> a = []
>>> b = a
>>> a.append("x")
>>> a
['x']
>>> b
['x']
>>>
同样的事情也发生在类对象上。事实上,如果你的链接列表不起作用,它就根本不起作用。