我看到了相关问题,但是我不能使用
据我所知,Python会给每个对象分配一个ID,那么为什么不能将其用作哈希值呢?我需要维护对所有内部集合的引用列表,即使它们发生改变。 编辑:好的,我明白了为什么,但在这种情况下,这是更可取的,因为我只关心引用相等性,而不是值相等性。
我该怎么做?
我基本上有一个游戏板,我想将棋子分成组(或“链”)。上面的代码很好用,直到我添加了
那么我如何维护它创建的所有集合的列表?请记住,我还需要删除集合(这就是为什么我想使用另一个集合作为外部集合的原因)。
将引用包裹在
frozenset
作为我的内部集合。我希望一切都是可变的。据我所知,Python会给每个对象分配一个ID,那么为什么不能将其用作哈希值呢?我需要维护对所有内部集合的引用列表,即使它们发生改变。 编辑:好的,我明白了为什么,但在这种情况下,这是更可取的,因为我只关心引用相等性,而不是值相等性。
我该怎么做?
你可能会问“为什么”,所以我给你一些代码:
def remove_captured(self):
all_chains = set()
chains = Grid(self.rows, self.cols)
for m, n, stone in self.enumerate():
if stone == self[m - 1, n]:
chains[m, n] = chains[m - 1, n]
if stone == self[m, n - 1]:
all_chains.discard(chains[m, n - 1])
chains[m, n].update(chains[m, n - 1])
for s in chains[m, n - 1]:
chains[s] = chains[m, n]
elif stone == self[m, n - 1]:
chains[m, n] = chains[m, n - 1]
else:
chains[m, n] = set()
all_chains.add(chains[m, n])
chains[m, n].add((m,n))
chains._print()
print all_chains
我基本上有一个游戏板,我想将棋子分成组(或“链”)。上面的代码很好用,直到我添加了
all_chains
- 它创建了所有集合,但是我没有办法访问它创建的每个集合,而不必再次遍历整个棋盘。那么我如何维护它创建的所有集合的列表?请记住,我还需要删除集合(这就是为什么我想使用另一个集合作为外部集合的原因)。
将引用包裹在
weakref.ref()
中也不起作用:all_chains.add(weakref.ref(chains[m, n])) # TypeError: unhashable type: 'set'
set()
并创建一个__hash__()
方法,该方法返回其id
。这应该允许您创建集合的集合。另一个选项是创建内部集合的可哈希表示,同样使用这些表示作为键将它们映射到实际对象。 - Joel Cornett