【问题标题】:Python function calling on linked list, call by value/call by referencePython函数调用链表,按值调用/按引用调用
【发布时间】: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


【解决方案1】:

它是按值传递的引用(即类似于在 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)

【讨论】:

  • Python 不支持传递引用。它只支持传值。
  • “值”本身就是一个引用。
  • 对。它是对列表的引用,但它是按值传递的。看看 OP 的要求:Is is passed by reference。它不是。正确答案是“不,它是按值传递的”。按引用传递值与按值传递引用之间有一个主要区别。
  • 我想正确的措辞是“这是一个按值传递的引用”...
  • 是的,正如我所说。 Python 不支持按引用传递参数。它始终是按值传递的,即使该值是引用。如果被调用函数更改了参数(与其引用的相反),调用者永远不会看到更改。
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 2017-03-27
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多