| # 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]) |