1
2# The cycle GC collector can be executed when any GC-tracked object is
3# allocated, e.g. during a call to PyList_New(), PyDict_New(), ...
4# Moreover, it can invoke arbitrary Python code via a weakref callback.
5# This means that there are many places in the source where an arbitrary
6# mutation could unexpectedly occur.
7
8# The example below shows list_slice() not expecting the call to
9# PyList_New to mutate the input list.  (Of course there are many
10# more examples like this one.)
11
12
13import weakref
14
15class A(object):
16    pass
17
18def callback(x):
19    del lst[:]
20
21
22keepalive = []
23
24for i in range(100):
25    lst = [str(i)]
26    a = A()
27    a.cycle = a
28    keepalive.append(weakref.ref(a, callback))
29    del a
30    while lst:
31        keepalive.append(lst[:])
32