链表调用的 Python 函数,按值调用/按引用调用

Python function calling on linked list, call by value/call by reference

提问人:Pranav M 提问时间:6/7/2021 更新时间:6/7/2021 访问量:883

问:

下面是打印链表的代码

 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) 时,输出应该是这样的(因为 50 被设置为 None)。事实并非如此。它产生相同的先前输出,即 。1-2-3-4-5-6-7-501-2-3-4-5-6-71-2-3-4-5-6-7-50

有人可以解释为什么没有产生我想要的输出,以及它是作为值调用还是引用调用而发生???.

Python 递归 链接列表 引用调用

评论

1赞 quamrana 6/7/2021
内德·巴切尔德(Ned Batchelder)的强制性链接
0赞 quamrana 6/7/2021
在 python 中,对象总是通过它们的引用来引用。变量保存这些引用,并且它们本身是可复制和可重新分配的。当变量作为参数传递时,它将被复制并成为新变量。在其参数中有一个新变量,只需分配对该局部变量的引用即可。linkedlist3()rootroot = NoneNone
1赞 Tom Karzes 6/7/2021
Python 中的所有参数都是按值传递的,而不是按引用传递的。在传递到链表函数的情况下,是对列表的引用,但它是按值传递的。因此,设置为 在返回之前立即不起作用,因为它所做的只是将局部变量设置为 。呼叫者永远不会看到这一点。rootrootrootNonerootNone

答:

1赞 Samwise 6/7/2021 #1

它是由值传递的引用(即它类似于在 C 中传递指针)。

设置时,将更改所引用节点的值,因此该节点的列表会更改。设置自身时,仅修改传入的引用,而不修改它引用的基础值,因此列表不受影响。root.nextnextrootroot

如果要删除链表的最后一个节点,则需要将倒数第二个节点设置为 。像这样:nextNone

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)

评论

0赞 Tom Karzes 6/7/2021
Python 不支持按引用传递。它仅支持按值传递。
2赞 Samwise 6/7/2021
“值”本身就是一个参考。
0赞 Tom Karzes 6/7/2021
右。它是对列表的引用,但它是按值传递的。看看 OP 问了什么:Is 是通过引用传递的。事实并非如此。正确答案是“不,它是按值传递的”。通过引用传递值与通过值传递引用之间存在主要区别。
0赞 Samwise 6/7/2021
我想正确的措辞是“这是一个按值传递的参考”......
0赞 Tom Karzes 6/7/2021
是的,就像我说的一样。Python 不支持按引用传递参数传递。它始终是按值传递的,即使该值是引用也是如此。如果被调用的函数更改了参数(而不是它引用的内容),则调用方永远不会看到更改。