Параметры Python в рекурсивной функции

#python

#python

Вопрос:

Я пытаюсь решить проблему алгоритма в LeetCode (https://leetcode.com/problems/reverse-linked-list /).
Я создал функцию recursiveList для решения этой проблемы путем рекурсии и ввел переменную newHead в качестве параметра.

 # Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    
    def recursiveList(self, head, newHead):
        if head.next == None:
            return ListNode(head.val)
        
        newHead.next = self.recursiveList(head.next, newHead)
        newHead = newHead.next
        return ListNode(head.val) 
    
    def reverseList(self, head: ListNode) -> ListNode:
        if head == None:
            return None
        
        newHead = ListNode()
        resultHead = ListNode(0, newHead)
        
        newHead.next = self.recursiveList(head, newHead)
        
        return resultHead.next
  

Результат

 Your input
[1,2,3,4,5]
Output
[0,1]
Expected
[5,4,3,2,1]
  

Я обнаружил, что когда функция recursiveList возвращает значение ListNode, новый заголовок сбрасывается. Другими словами newHead = newHead.next , не работает, когда recursiveList возвращает значение.
ниже почему ListNode{val: 5, next: None} обращается к ListNode{val: 0, next: ListNode{val: 5, next: None}} after return?

Извините за мой плохой английский. На всякий случай, если я не могу отвечать на комментарии, заранее благодарю вас!!!

 Node = self.recursiveList(head.next, newHead)
print("newHead first : %s" % newHead)
newHead.next = Node
newHead = newHead.next
print("newHead second : %s" % newHead)
print("return!")
return ListNode(head.val) 

  

Результат

 newHead first : ListNode{val: 0, next: None}
newHead second : ListNode{val: 5, next: None}
return!
newHead first : ListNode{val: 0, next: ListNode{val: 5, next: None}}
newHead second : ListNode{val: 4, next: None}
return!
newHead first : ListNode{val: 0, next: ListNode{val: 4, next: None}}
newHead second : ListNode{val: 3, next: None}
return!
newHead first : ListNode{val: 0, next: ListNode{val: 3, next: None}}
newHead second : ListNode{val: 2, next: None}
return!
  

Комментарии:

1. «ниже почему ListNode{val: 5, next: None} превращается в ListNode{val: 0, next: ListNode{val: 5, next: None}} после возврата?» Ну, ListNode{val: 5, next: None} это результат при печати newHead , но вы не возвращаете newHead , а вместо ListNode(head.val) этого . Так почему они должны быть одинаковыми?

2. Ну, я думаю, что функции python работают по вызову по ссылке, когда я помещаю объект класса в качестве параметра функции. Я ошибаюсь? На самом деле я никогда не возвращался newHead , но newHead изменился. почему это происходит?

3. Пожалуйста, прочитайте nedbatchelder.com/text/names1.html