我具有以下结构的链表。
class Node:
def __init__(self,val):
self.val = val
self.next = None
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)
n1.next = n2
n2.next = n3
n3.next = n4
最后一个节点的下一个是None,但是更新它时,它的确反映在链接列表中。
a = n4.next
a = Node(5)
print(n4.next)
>> None
但是当我直接更新(没有temp变量)时,它会起作用
n4.next = Node(5)
print(n4.next)
>> <<Node Object>>
为什么会这样?我以为None也是python中的对象,对象分配只是复制引用。
答案 0 :(得分:3)
我认为您正在将特殊的Python None
单例对象与普通的Python类实例混淆。
您将经典的编程语言“变量”一词(值的容器)与引用(引用或指向值的容器的变量)混淆了
在Python中,所有变量名都是对对象的引用。
所以说你做类似
a = n1
a.val = 10
这将反映在n1
对象(Node类实例)中,因为a
是对n1
的引用。
尝试做类似
n4.next = None
a = n4.next
a = Node(3)
将首先使a
引用None,然后将a
更改为引用另一个对象,即新的Node实例。
如果a
引用一个Node实例,则可以通过a
更改该实例
n4.next = Node(2)
a = n4.next
a.val = 5 #this would alter n4.next
但是,如果a
引用特殊对象None,则None不会像Node实例那样起作用,因此不能更改