32 lines
		
	
	
		
			753 B
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			753 B
		
	
	
	
		
			Python
		
	
	
	
| 
 | |
| # 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[:])
 |