mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			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[:])
							 |