可变命名元组?

Mutable namedtuple?

假设我有:

from collections import namedtuple
NT = namedtuple('name', ['x'])

谁能解释一下两者的区别:

  1. NT.x = 3
  2. var = NT(x=3)

我可以将 NT.x 更改为任何内容(可变),但 var.x 是不可变的。为什么会这样?

NT 不是命名元组。 NT 是一个 class。它的实例是命名元组。

您不能在实例上重新分配 x。虽然您 可以 在技术上与 class 上的 x 混淆,但这将破坏实例的 x 属性的属性访问,因为 x 在 class 上是一个 descriptor 实例依赖于实现相应的实例属性。

namedtuple 是 class 工厂。

NT(x=3) 为您提供新创建的实例 class。

NT.x =3 在 class 本身上设置一个属性。

NT.xclass NT 的属性,而不是 实例 的属性其中 class:

>>> NT.x
<property object at 0x7f2a2dac6e58>

它的存在只是告诉你 NT 的实例有一个名为 x 的 属性。另见 this question