Python 为什么函数中的列表输出不同于main中的列表输出?

Python 为什么函数中的列表输出不同于main中的列表输出?,python,python-3.x,linked-list,Python,Python 3.x,Linked List,我的问题是关于LeetCode练习: 给定一个链表,每两个相邻节点交换一次,并返回其头部 例1: 例2: 例3: 我包括了一个打印链表的lprint()函数 创建此列表时: 1->2->3->4->5->6 …调用swap,然后在\uuuuuu main\uuuuuu区域中调用lprint(head),然后链表的第一个值仍然是1: 1->4->3->6->5 虽然它应该是: 2->1->4->3->6->5

我的问题是关于LeetCode练习:

给定一个链表,每两个相邻节点交换一次,并返回其头部

例1: 例2: 例3: 我包括了一个打印链表的
lprint()
函数

创建此列表时:

1->2->3->4->5->6
…调用
swap
,然后在
\uuuuuu main\uuuuuu
区域中调用
lprint(head)
,然后链表的第一个值仍然是
1

1->4->3->6->5
虽然它应该是:

2->1->4->3->6->5
但是如果我在
defswap()
区域调用
lprinf(head)
,答案是正确的

我不明白为什么会有这种差异

这是我的密码:

class Node:
  def __init__(self, val):
    self.val = val
  next = None

def lprint(head):
  p = head
  while p:
    if p.next:
      print(p.val, end='->')
    else:
      print(p.val)
    p = p.next

def swap(head):
  if not head: return None
  p0, p1, p2 = None, head, head.next
  while p1 and p2:
    if not p0:
      p1.next, p2.next = p2.next, p1
      head = p2
      p1, p2 = p2, p1
      p0, p1, p2 = head, p1.next, p2.next
      if p1 and p2:
        p0, p1, p2 = p0.next, p1.next, p2.next
      else:
        break
    else:
      p0.next, p1.next, p2.next = p2, p2.next, p1
      p1, p2 = p2, p1
      p0, p1, p2 = p0.next, p1.next, p2.next
      if p1 and p2:
        p0, p1, p2 = p0.next, p1.next, p2.next
      else:
        break
  print('inner:',end=' ')
  lprint(head) # correct answer

if __name__ == '__main__':
  for i in range(6):
    if i == 0:
        head = p = Node(i+1)
    else:
        p.next = Node(i+1)
        p = p.next
  lprint(head) # before swap
  swap(head) 
  lprint(head) # wrong answer

至于它没有按预期打印最终结果的原因:这是因为
swap
函数修改了其名为
head
的局部变量,但调用方没有被告知此更改,并且仍然有自己的
head
变量引用最初位于第一个位置的节点,但现在处于第二位。因此,打印该列表将从第二个节点开始,而不是从第一个节点开始

请注意,LeetCode挑战要求您返回对修改列表的引用。因此,您的
交换
功能应以以下内容结束:

return head
…您的主代码应采用该返回值:

head = swap(head)
如果这样做,对
printl
的第二次调用将输出您所期望的结果


但是请注意,在LeetCode挑战中,您只需提交
交换
函数的实现,因为LeetCode将调用该函数本身,并验证函数返回的值。

指向练习本身的快速链接,在你的问题中可能也有这样一个问题:我认为在leetcode练习中,你根本不应该使用
if\uu\u name
块。代码是否执行,或者它会给您什么作为错误?另外,你能不能把leetcode的完整代码包括进来,这样我就可以使用它了,我在粘贴你的代码时遇到了缩进的问题
class Node:
  def __init__(self, val):
    self.val = val
  next = None

def lprint(head):
  p = head
  while p:
    if p.next:
      print(p.val, end='->')
    else:
      print(p.val)
    p = p.next

def swap(head):
  if not head: return None
  p0, p1, p2 = None, head, head.next
  while p1 and p2:
    if not p0:
      p1.next, p2.next = p2.next, p1
      head = p2
      p1, p2 = p2, p1
      p0, p1, p2 = head, p1.next, p2.next
      if p1 and p2:
        p0, p1, p2 = p0.next, p1.next, p2.next
      else:
        break
    else:
      p0.next, p1.next, p2.next = p2, p2.next, p1
      p1, p2 = p2, p1
      p0, p1, p2 = p0.next, p1.next, p2.next
      if p1 and p2:
        p0, p1, p2 = p0.next, p1.next, p2.next
      else:
        break
  print('inner:',end=' ')
  lprint(head) # correct answer

if __name__ == '__main__':
  for i in range(6):
    if i == 0:
        head = p = Node(i+1)
    else:
        p.next = Node(i+1)
        p = p.next
  lprint(head) # before swap
  swap(head) 
  lprint(head) # wrong answer
return head
head = swap(head)