更新“无”值不会反映在对象中

时间:2019-04-20 21:08:03

标签: python python-3.x linked-list nonetype

我具有以下结构的链表。

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中的对象,对象分配只是复制引用。

1 个答案:

答案 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实例那样起作用,因此不能更改