Python函数调用链表,由value/call通过引用调用
Python function calling on linked list, call by value/call by reference
下面是打印链表的代码
def printlinkedlist(root):
if root==None:
return
print(root.data)
printlinkedlist(root.next)
假设链表包含
1-2-3-4-5-6-7-8
通过调用 printlinkedlist(root) -------->它给出 put as------>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.ie,当调用 linkedlist(root ).这不是发生了什么。它产生相同的先前输出,即 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)
下面是打印链表的代码
def printlinkedlist(root):
if root==None:
return
print(root.data)
printlinkedlist(root.next)
假设链表包含
1-2-3-4-5-6-7-8
通过调用 printlinkedlist(root) -------->它给出 put as------>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.ie,当调用 linkedlist(root ).这不是发生了什么。它产生相同的先前输出,即 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)