我已经看到了相关的问题,但我不能将 afrozenset
用于我的内部集。我希望一切都是可变的。
据我了解,Python 给所有东西一个ID,那么它为什么不能用它作为它的 hash呢?我需要维护一个对所有内部集的引用列表,即使它们发生了变化。
编辑:好的,我明白为什么,但在这种情况下它会更好,因为我只关心引用相等,而不关心值相等。
我怎样才能做到这一点?
你会问“为什么”,所以我会给你一些代码:
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'