【发布时间】:2018-04-16 11:17:58
【问题描述】:
假设我有:
from collections import namedtuple
NT = namedtuple('name', ['x'])
谁能解释一下两者的区别:
-
NT.x = 3 -
var = NT(x=3)
我可以将NT.x 更改为任何东西(可变),但var.x 是不可变的。为什么会这样?
【问题讨论】:
标签: python namedtuple
假设我有:
from collections import namedtuple
NT = namedtuple('name', ['x'])
谁能解释一下两者的区别:
NT.x = 3
var = NT(x=3) 我可以将NT.x 更改为任何东西(可变),但var.x 是不可变的。为什么会这样?
【问题讨论】:
标签: python namedtuple
NT 不是命名元组。 NT 是一个类。它的实例是命名元组。
您不能在实例上重新分配 x。虽然您可以在技术上与类上的x 混淆,这将破坏实例的x 属性的属性访问,因为类上的x 是descriptor实例依赖实现对应的实例属性。
【讨论】:
namedtuple 是一个类工厂。
NT(x=3) 为您提供新创建的类的实例。
NT.x =3 为类本身设置一个属性。
【讨论】:
NT.x 是类 NT 的属性,而不是该类的实例:
>>> NT.x
<property object at 0x7f2a2dac6e58>
它的存在只是告诉您NT 的实例有一个名为x 的属性。另见this question。
【讨论】: