Python函数调用链表,按值调用/按引用调用
下面是打印链接列表的代码Python函数调用链表,按值调用/按引用调用,python,recursion,linked-list,pass-by-reference,call-by-value,Python,Recursion,Linked List,Pass By Reference,Call By Value,下面是打印链接列表的代码 def printlinkedlist(root): if root==None: return print(root.data) printlinkedlist(root.next) 假设链表包含 1-2-3-4-5-6-7-8 通过调用printlinkedlist(root)--->它的输出为------->1-2-3-4-5-6-7-8 现在,我调用另一个函数 def linkedlist2(root): if root==None:
def printlinkedlist(root):
if root==None:
return
print(root.data)
printlinkedlist(root.next)
假设链表包含
1-2-3-4-5-6-7-8
通过调用printlinkedlist(root)--->它的输出为------->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
本身时,只修改传入的引用,而不是它引用的基础值,因此列表不受影响
如果要删除链表的最后一个节点,则需要将倒数第二个节点的下一个
设置为无
。比如:
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 pop_last(root):
如果root为None或root.next为None:
raise IndexError(“无法从len<2的列表中弹出”)
如果root.next.next为无:
val=root.next.data
root.next=None
返回值
返回上一个pop_(root.next)
python中对象的强制链接始终由它们的引用引用。变量包含这些引用,并且自身可复制和重新分配。当变量作为参数传递时,它将被复制并成为新变量。在linkedlist3()
中,它的root
参数是一个新变量,root=None
只是将对None
的引用分配给该局部变量。Python中的所有参数都是按值传递的,而不是按引用传递的。在将root
传递给链接列表函数的情况下,root
是对列表的引用,但它是按值传递的。因此,在返回之前立即将root
设置为None
没有任何效果,因为它所做的只是将局部变量root
设置为None
。调用方从未看到过这一点。Python不支持按引用传递。它只支持传递值。“值”本身就是一个引用。对。它是对列表的引用,但它是按值传递的。看看OP问的问题:是通过引用传递的。事实并非如此。正确的答案是“不,它是按值传递的”。按引用传递值与按值传递引用之间有一个主要区别。我想正确的措辞是“它是按值传递的引用”…是的,正如我所说的。Python不支持按引用传递参数。它始终是按值传递的,即使该值是引用。如果被调用函数更改了参数(与它引用的参数相反),调用方将永远看不到更改。