是否总是通过引用传递类实例?

时间:2019-09-20 18:52:09

标签: python-3.x pass-by-reference singly-linked-list

我正在Python3中实现一个LinkedList。该程序将“ current_node”分配给“ previous_node”,然后将“ current_node”更改为“ current_node.next”。我希望此更改也适用于“ previous_node”,但不会适用。

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

a = [7, 8, 11, 3]

fst_node, sec_node, thd_node, frt_node = ListNode(a[0]), ListNode(a[1]), ListNode(a[2]), ListNode(a[3])

fst_node.next = sec_node
sec_node.next = thd_node
thd_node.next = frt_node

current_node  = sec_node
previous_node = current_node
print(previous_node, current_node)
current_node  = current_node.next
print(previous_node, current_node)

2 个答案:

答案 0 :(得分:0)

current_node  = sec_node
previous_node = current_node  # current_node points to the same object as previous_node
print(previous_node, current_node)
current_node  = current_node.next  # changes where current_node points to
print(previous_node, current_node)

您是否注意到previous_node没有在此处重新分配?只有current_node是。这仍然是按引用传递的,您只是在更改current_node的引用,而将precious_node保留下来。

答案 1 :(得分:0)

引用(变量)和对象本身不是同一件事。

您可以更改变量以指向另一个对象,但不会更改该对象。

objRef = someObject
anotherObjRef = objRef
objRef = anotherObject
# anotherObjRef will still point to someObject!

但是,如果您修改对象中的某些内容(通过引用),则该对象将被修改,因此您将在所有引用中看到新值:

objRef = someObject
anotherObjRef = objRef
objRef.someData = something
# anotherObjRef.someData is something!