Lib/test/crashers/nasty_eq_vs_dict.py
# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html # if you keep changing a dictionary while looking up a key, you can # provoke an infinite recursion in C # At the time neither Tim nor Michael could be bothered to think of a # way to fix it. class Yuck: def __init__(self): self.i = 0 def make_dangerous(self): self.i = 1 def __hash__(self): # direct to slot 4 in table of size 8; slot 12 when size 16 return 4 + 8 def __eq__(self, other): if self.i == 0: # leave dict alone pass elif self.i == 1: # fiddle to 16 slots self.__fill_dict(6) self.i = 2 else: # fiddle to 8 slots self.__fill_dict(4) self.i = 1 return 1 def __fill_dict(self, n): self.i = 0 dict.clear() for i in range(n): dict[i] = i dict[self] = "OK!" y = Yuck() dict = {y: "OK!"} z = Yuck() y.make_dangerous() print dict[z] |