115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html 215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# if you keep changing a dictionary while looking up a key, you can 415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# provoke an infinite recursion in C 515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# At the time neither Tim nor Michael could be bothered to think of a 715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# way to fix it. 815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsonclass Yuck: 1015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson def __init__(self): 1115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.i = 0 1215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 1315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson def make_dangerous(self): 1415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.i = 1 1515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 1615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson def __hash__(self): 1715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson # direct to slot 4 in table of size 8; slot 12 when size 16 1815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson return 4 + 8 1915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 2015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson def __eq__(self, other): 2115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson if self.i == 0: 2215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson # leave dict alone 2315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson pass 2415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson elif self.i == 1: 2515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson # fiddle to 16 slots 2615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.__fill_dict(6) 2715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.i = 2 2815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson else: 2915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson # fiddle to 8 slots 3015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.__fill_dict(4) 3115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.i = 1 3215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 3315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson return 1 3415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 3515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson def __fill_dict(self, n): 3615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson self.i = 0 3715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson dict.clear() 3815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson for i in range(n): 3915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson dict[i] = i 4015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson dict[self] = "OK!" 4115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 4215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsony = Yuck() 4315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsondict = {y: "OK!"} 4415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson 4515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsonz = Yuck() 4615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsony.make_dangerous() 4715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsonprint dict[z] 48