在 Python 中通过引用和值传递



我正在做一个来自LeetCode的问题。我发现了一些对我来说没有多大意义的东西。

问题:

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

例如,给定 1->2->3->4,您应该将列表返回为 2->1->4->3.

您的算法应仅使用常量空间。您不得修改 列表中的值,只有节点本身可以更改。

我的解决方案:

class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
dummy = ListNode(0)
dummy.next = head
curr = dummy
while curr.next and curr.next.next:
a = curr.next
b = curr.next.next
curr.next = b
a.next = b.next
b.next = a
curr = a
return dummy.next

困惑:

当我做curr = dummy时,似乎假人是通过引用传递的,变异curr会变异dummy。但是返回语句return dummy.next的值与return curr.next?既然curr = dummy,在循环的末尾,curr在列表的末尾,那么dummy不应该也在列表的末尾吗?但是,dummy仍然位于列表的最前面,dummy.next是传递到函数中的列表的开头,但以正确的方式发生了变化。

另外,当我这样做时:

if curr is dummy:
print("BEGIN")
while curr.next and curr.next.next:
a = curr.next
b = curr.next.next
curr.next = b
a.next = b.next
b.next = a
curr = a
if curr is dummy:
print("END")

BEGIN被打印出来,但END没有。

有人可以为我消除困惑吗?

当你做作业var = x时,你会var指向x。它不会使指向同一对象的其他变量指向在此之后x

请考虑以下示例:

>>> a = {'p': 2}
>>> b = a
>>> b
{'p': 2}
>>> b['p'] = 4
>>> a
{'p': 4}
>>> b = {'q': 3}
>>> a
{'p': 4}
>>> b
{'q': 3}

或者这个:

>>> class Node:
...     def __init__(self, nxt):
...         self.nxt = nxt
...     def __repr__(self):
...         return '(Node => %s)' % self.nxt
... 
>>> a = Node(Node(2))
>>> a
(Node => (Node => 2))
>>> b = a
>>> b
(Node => (Node => 2))
>>> a.nxt = Node(4)
>>> a
(Node => (Node => 4))
>>> b
(Node => (Node => 4))
>>> b = b.nxt
>>> a
(Node => (Node => 4))
>>> b
(Node => 4)

相关内容

  • 没有找到相关文章

最新更新