Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数调用链表,按值调用/按引用调用_Python_Recursion_Linked List_Pass By Reference_Call By Value - Fatal编程技术网

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不支持按引用传递参数。它始终是按值传递的,即使该值是引用。如果被调用函数更改了参数(与它引用的参数相反),调用方将永远看不到更改。