¿Se comportan de manera diferente que un bucle a través de la dict y del
eting ellos?
Vale la pena señalar aquí que cualquier clase personalizada implementación de la clase base abstracta MutableMapping
clear()
obtiene como un método mixin "libre".
Los únicos métodos que necesita para anular el fin de crear una instancia de una subclase MutableMapping
son:
__getitem__, __setitem__, __delitem__, __iter__, __len__
Ya que se puede almacenar los datos en su clase de mapeo lo que le gusta, la única manera clear()
puede encontrar la manera para borrar sus datos es usando uno o más de esos cinco métodos. Ahora, puede adivinar qué métodos está usando clear()
, pero ¿por qué adivinar cuándo podemos experimentar?
import collections
class MyMap(collections.MutableMapping):
def __init__(self, mydict):
self._top_secret_data = mydict
def __getitem__(self, key):
print 'getitem'
return self._top_secret_data[key]
def __setitem__(self, key, value):
raise Exception('where did you want that?')
def __len__(self):
raise Exception('a gentleman never tells')
def __delitem__(self, key):
print '[shredding intensifies]'
del self._top_secret_data[key]
def __iter__(self):
def keygen():
for key in self._top_secret_data:
print 'faster! faster!'
yield key
return iter(keygen())
Utilización de la clase definida anteriormente, es fácil ver cómo se implementa clear()
:
>>> m = MyMap({1:'a', 2:'b', 3:'c'})
>>> m.clear()
faster! faster!
getitem
[shredding intensifies]
faster! faster!
getitem
[shredding intensifies]
faster! faster!
getitem
[shredding intensifies]
>>>
En otras palabras, el método mixin clear()
se implementa básicamente como for key in self: del self[key]
.
Ahora, un descargo de responsabilidad: incorporado en tipos tales como dict
se implementan en C, por lo que el método dict.clear
puede no ser literalmente idéntica a for key in mydict: del mydict[key]
. Yo esperaría alguna optimización detrás de las escenas, tal vez una estrategia completamente diferente - pero espero que este ejemplo le da una idea de cómo se puede esperar que clear()
un método para trabajar en Python.
En otras palabras, si se comparten o las llaves o los valores (asignado a otra variable), no se eliminarán los objetos ni por 'd.clear()', ni por 'del d [ clave] '. Un diccionario almacena referencias a claves y valores. * Las referencias borran * las operaciones. – pepr
@pepr Eso es correcto. – Marcin
Sí, entonces la clave que me faltaba aquí es borrar la operación, solo borra la referencia, la limpieza de memoria es manejada por el recolector de basura – 0xc0de