| # The cycle GC collector can be executed when any GC-tracked object is | |
| # allocated, e.g. during a call to PyList_New(), PyDict_New(), ... | |
| # Moreover, it can invoke arbitrary Python code via a weakref callback. | |
| # This means that there are many places in the source where an arbitrary | |
| # mutation could unexpectedly occur. | |
| # The example below shows list_slice() not expecting the call to | |
| # PyList_New to mutate the input list. (Of course there are many | |
| # more examples like this one.) | |
| import weakref | |
| class A(object): | |
| pass | |
| def callback(x): | |
| del lst[:] | |
| keepalive = [] | |
| for i in range(100): | |
| lst = [str(i)] | |
| a = A() | |
| a.cycle = a | |
| keepalive.append(weakref.ref(a, callback)) | |
| del a | |
| while lst: | |
| keepalive.append(lst[:]) |