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