Python 可以在set()中使用namedtuples吗?

Python 可以在set()中使用namedtuples吗?,python,set,tuples,namedtuple,Python,Set,Tuples,Namedtuple,我知道namedtuple是一个工厂函数,用于创建具有不可变数据字段的类。我假设它们是可散列的,以便可以在集合中使用。我担心的是,在集合中使用namedtuples是否会有任何问题。e、 g.如果存在嵌套的命名双元组,是否会出现问题?是的,它们是可散列的,可以在集合中使用,如元组 问题在于,可变对象的元组可以在您的下面更改 在这方面,由不可变对象组成的元组是安全的 不确定这是否是一个问题,但值得注意的是@user2357112supportsMonica在评论中的评论: 另一个问题是namedt

我知道
namedtuple
是一个工厂函数,用于创建具有不可变数据字段的类。我假设它们是可散列的,以便可以在集合中使用。我担心的是,在集合中使用namedtuples是否会有任何问题。e、 g.如果存在嵌套的
命名双元组,是否会出现问题?

是的,它们是可散列的,可以在集合中使用,如
元组

问题在于,可变对象的元组可以在您的下面更改

在这方面,由不可变对象组成的元组是安全的

不确定这是否是一个问题,但值得注意的是@user2357112supportsMonica在评论中的评论:


另一个问题是namedtuple仍然是一个tuple,它的
\uuuuuuuuuuuuuuuuuu散列
\uuuuuuuueq
是普通的元组散列和相等。名元组
将与普通的元组或不相关的实例进行比较
namedtuple
classes(如果内容匹配)


因此,只要元组不是由可变对象组成的,它就应该是正常的。e、 g.字段中没有列表?是的,不可变对象是安全的。另一个问题是,命名的元组仍然是元组,它的
\uuuuuuuhash\uuuuuu
\uuuuuuuuuueq\uuu
是普通的元组哈希和相等。如果内容匹配,NamedTupe将与普通元组或不相关NamedTupe类的实例进行比较。很好@user2357112supportsMonica,我在回答中添加了您的备注。您在尝试时遇到了什么问题?如果它们在任何级别都是可变的,那么您将无法在一个集合中使用它们。如果它们是完全不可变的,那么您可以在一个集合中自由地使用它们。我担心的是,我的
namedtuple
的字段在运行时是否会包含可变对象,以及这是否会影响事情(它会影响)。我想我可以设计一种方式来确保不会发生这种情况,然后在将元组添加到集合之前测试元组,或者将其包装在
try except
block.search“Python test hashable”。@sabik:这会给出误报。只需调用
hash