【发布时间】:2021-08-24 15:44:40
【问题描述】:
下面是打印链表的代码
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
疑问一:由于原根中的值发生了变化,那么根是值传递还是引用传递?
希望它是通过引用传递的,如果是这样的话
def linkedlist3(root):
if root==None:
return
print(root.data)
if root.next==None:
root=None
return
linkedlist3(root.next)
这基本上使最后一个节点为无。即,1-2-3-4-5-6-7-50 输出应该类似于1-2-3-4-5-6-7(因为 50 被设为无)当调用链接列表(根)时。这不是发生的事情。它产生相同的先前输出,即1-2-3-4-5-6-7-50。
有人可以解释为什么我想要的输出没有产生,以及它是按值调用还是按引用调用???。
【问题讨论】:
-
强制链接到Ned Batchelder
-
在 python 中,对象总是通过它们的引用来引用。变量保存这些引用,并且它们本身是可复制和可重新分配的。当一个变量作为参数传递时,它被复制并成为一个新变量。在
linkedlist3()中,它的root参数是一个新变量,root = None只是将对None的引用分配给该局部变量。 -
Python 中的所有参数都是按值传递的,而不是按引用传递。在将
root传递给链表函数的情况下,root是对列表的引用,但它是按值传递。所以在返回之前立即将root设置为None没有任何效果,因为它所做的只是将局部变量root设置为None。调用者永远不会看到。
标签: python recursion linked-list pass-by-reference call-by-value