【发布时间】:2019-11-08 01:53:44
【问题描述】:
我有一个单链表 L,并创建一个指向该列表 P 的指针。似乎有时修改 P 会更改实际列表,而其他时候修改 P 对实际列表 L 没有任何作用,只会改变什么P 指向。
假设我创建了一个指向 L 的指针,P = L(在 python 中)。执行 P = P.next 之类的操作使 L 保持不变,但 P.next = P.next.next 会更改 L。类似地,通过修改 P.data 更改存储在列表中的实际数据实际上会更改 L.data。
为什么会这样?我觉得我缺少一些关于指针/引用的基本知识。
class Node:
def __init__(self, val):
self.val = val
self.next = None
def addNode(self, val):
root = self
while root.next is not None:
root = root.next
root.next = Node(val)
def iterateLL(self):
root = self
print
while root is not None:
print(str(root.val) + " ", end="")
root = root.next
print()
if __name__ =="__main__":
L = Node(1)
L.addNode(2)
L.addNode(3)
L.addNode(4)
# iterate through list and print:
L.iterateLL()
# changing value of pointer does not affect L
P = L
P = P.next
L.iterateLL() # L is unchanged
# changing "next" value of pointer does affect L
P = L
P.next = P.next.next
L.iterateLL() # now we've skipped node 2
# changing data of pointer does affect L
P = L
P.val = 10
L.iterateLL()
上面的代码执行后输出如下(第一行显示原始链表,第二行显示指针P更改后链表没有变化,而第三和第四行显示链表发生了变化)
1 2 3 4
1 2 3 4
1 3 4
10 3 4
这里发生了什么?为什么更改 P 不会影响 L,但更改 P.next 和 P.val 会?如果所有这些操作的行为方式相同,那么更改指针也不会总是更改链接列表(因此 P = P.next 应该通过删除第一个节点来修改 L),或 从不 更改链接列表(因此 P.next = P.next.next 应该保持 L 不变)?
我感觉这与 L.next 是一个指针这一事实有关,就像 P.next 一样。所以修改 P.next 最终会修改 L.next 指向的(?)。但我觉得规则对我来说不是很清楚。
【问题讨论】:
-
python中没有指针
-
如果我把手指指向你,然后我开始指向 Joe,这不会影响你或 Joe。如果我走到你面前,用你的手指指向 Joe 指向的任何人,那确实会影响你。
-
@SamuelMuldoon Python 中几乎所有的东西都是一个指针,Python 只是很好地隐藏了它们。大多数人甚至没有想到他们正在使用的变量只是指针这一事实。
标签: python pointers linked-list reference