可变命名元组?
Mutable namedtuple?
假设我有:
from collections import namedtuple
NT = namedtuple('name', ['x'])
谁能解释一下两者的区别:
NT.x = 3
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.x
是 class NT
的属性,而不是 实例 的属性其中 class:
>>> NT.x
<property object at 0x7f2a2dac6e58>
它的存在只是告诉你 NT
的实例有一个名为 x
的 属性。另见 this question。
假设我有:
from collections import namedtuple
NT = namedtuple('name', ['x'])
谁能解释一下两者的区别:
NT.x = 3
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.x
是 class NT
的属性,而不是 实例 的属性其中 class:
>>> NT.x
<property object at 0x7f2a2dac6e58>
它的存在只是告诉你 NT
的实例有一个名为 x
的 属性。另见 this question。