Python函数调用链表,按值调用/按引用调用



下面是打印链接列表的代码

def printlinkedlist(root):
if root==None:
return
print(root.data)
printlinkedlist(root.next)

假设链接列表包含

1-2-3-4-5-6-7-8

通过调用printlinkedlist(根(------->它发出------>1-2-3-4-5-6-7-8

现在,我调用另一个函数

def linkedlist2(root):
if root==None:
return
print(root.data)
if root.next==None:
root.data=50
return
linkedlist2(root.next)

这基本上使最后一个元素的值为50。当我调用函数printlinkedlist(root)时,它会产生1-2-3-4-5-6-7-50

疑问1:由于原始根中的值发生了变化,根是通过值传递还是通过引用传递?

希望它能通过参考,如果是的话

def linkedlist3(root):
if root==None:
return
print(root.data)
if root.next==None:
root=None
return
linkedlist3(root.next)

基本上使最后一个节点为None。即,当调用linkedlist(root(时,1-2-3-4-5-6-7-50的输出应该像1-2-3-4-5-6-7一样(因为50被设为None(。事情并非如此。它产生相同的先前输出,即1-2-3-4-5-6-7-50

有人能解释一下为什么我想要的输出没有产生,以及它是按值调用还是按引用调用???。

它是一个按值传递的引用(即,它类似于在C中传递指针(。

设置root.next时,将更改root所指节点的next的值,因此该节点的列表将发生更改。设置root本身时,只修改传入的引用,而不是它引用的基础值,因此列表不受影响。

如果要删除链表的最后一个节点,则需要将倒数第二个节点的next设置为None。类似于:

def pop_last(root):
if root is None or root.next is None:
raise IndexError("can't pop from list with len < 2")
if root.next.next is None:
val = root.next.data
root.next = None
return val
return pop_last(root.next)

最新更新