Python循环链表,为什么原始头没有改变?

时间:2016-12-13 00:23:58

标签: python loops linked-list

我试图理解Python的pass参数的方式。我知道Python与C ++和其他语言不同。它是通过对象引用传递的。

我尝试使用这些代码:

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)

node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5


def testWithPointers1(head):
    head.next = None   

如果我做testWithPointers1(node1)

然后node1.next将为None

def testWithPointers2(head):
    cur = head
    cur.next = None

如果我做testWithPointers1(node1)

然后node1.next将为None

def printLinkedList(head):
    while head:
        print(head.val)
        head = head.next

但为什么这段代码在调用printLinkedList(node1)之后,不会改变node1的值?

1 个答案:

答案 0 :(得分:1)

它不会更改 node1 值,因为您所做的只是更改节点的本地副本。在每个例程中, head 是一个指向您传入的节点的局部变量。它不是 node1 的别名;它只是对节点的另一个引用。

当您更改节点的字段时,您指向节点所在的实际内存位置,因此当您通过 node1 引用相同位置时,您会看到这些更改。但是,更改 head 的值不会更改 node1 引用。