import unittest PySet_MINSIZE = 8 SET_MASK = PySet_MINSIZE - 1 FIXED_HASH = 1 if not FIXED_HASH: hash_values = [None] * 1000 else: hash_values = [3, 2, 5, 6, 5, 1, 0, 3, 4, 2, 0, 1, 3, 2, 3, 4, 7, 7, 7, 2, 0, 1, 4, 6, 0, 3, 3, 1, 3, 2, 0, 7, 7, 7, 2] hash_i = 0 class Thread2: def __init__(self): global hash_i if FIXED_HASH: # XXX: it seems like the leak occurs here: # a dict with shared keys is created self.hashvalue = hash_values[hash_i] else: k = hash(self) & SET_MASK hash_values[hash_i] = k print(hash_values[:hash_i+1]) hash_i += 1 if FIXED_HASH: def __hash__(self): return self.hashvalue class LeakTest(unittest.TestCase): def test_leak(self): item = Thread2() dangling.add(item) dangling.discard(item) item = None dangling = set() main_thread = Thread2() dangling.add(main_thread)