[英]Python function calling on linked list, call by value/call by reference
下面是打印鏈表的代碼
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
現在,我打電話給另一個 function
def linkedlist2(root):
if root==None:
return
print(root.data)
if root.next==None:
root.data=50
return
linkedlist2(root.next)
這基本上使最后一個元素值為 50。當我調用 function 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)
這基本上使最后一個節點為 None.ie, 1-2-3-4-5-6-7-50
output 應該像1-2-3-4-5-6-7
(因為 50 被制作為無)調用linkedlist(root)時。 這不是發生的事情。 它產生與之前相同的 output,即1-2-3-4-5-6-7-50
。
有人可以解釋為什么我想要的 output 沒有生產,以及它是按值調用還是按引用調用???。
它是按值傳遞的引用(即類似於在 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.