【问题标题】:Updating 'None' value does not reflect in the object更新“无”值不会反映在对象中
【发布时间】:2019-09-10 15:55:23
【问题描述】:

我有如下结构的链表。

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

最后一个节点的 next 是 None ,但是当更新它时,它确实反映在链表中。

a = n4.next 
a = Node(5)
print(n4.next)
>> None

但是当我直接更新(没有临时变量)时,它可以工作

n4.next = Node(5)
print(n4.next)
>> <<Node Object>>

为什么会这样?我认为 None 也是 python 中的对象,对象分配只是复制引用。

【问题讨论】:

  • 你想做什么?你设置 self.next 等于 none,这很好。它返回很好,然后你使它等于一个对象?为什么? n4.next = Node(5) print(n4.next.next) returns 也没有
  • None 是一个单身人士。只有一个 None 对象,因此更改该对象的身份会破坏...嗯,几乎一切。很高兴口译员不让你这样做。
  • 无论如何,a = Node(5) 正在用新值替换分配给a 的旧值;它修改该引用的先前对象(a 曾经指向的东西);相反,它只会使a 指向不同的东西,而使旧的指向对象完全未修改(尽管引用计数较低,并且如果引用计数现在为 0,则会进行垃圾回收)。

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


【解决方案1】:

我认为您将特殊的 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 实例那样工作,因此无法更改

【讨论】:

  • 希望你不介意我的编辑。我认为这比解释几个问题让您编辑更容易。
  • @progmatico 感谢您清理它,我在用一种没有明确使用它们的语言解释指针时遇到了麻烦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多