La respuesta de Joachim Sauer explica muy bien por qué no se devuelve list
. Pero esto deja la pregunta de por qué estas funciones no devolverían los iteradores, como lo hizo iteritems
etc. en Python 2.
Un iterador es mucho más restrictivo que un contenedor. Por ejemplo, un iterador no permite más de una pasada; si intenta un segundo pase, verá que está vacío. Por lo tanto, operaciones como elem in cont
son soportadas por contenedores, pero no pueden ser soportadas por iteradores: una vez que se comprueba si un elemento está "en" el iterador, el iterador se destruye.
Por otro lado, para obtener un contenedor generalmente es necesario realizar una copia, como crear una lista con las teclas del diccionario.
El objeto view
tiene lo mejor de dos mundos: se comporta como un contenedor y, sin embargo, no hace una copia del diccionario. De hecho, es una especie de contenedor virtual de solo lectura que funciona al vincular al diccionario subyacente. No sé si se ve en cualquier otro lugar del Python estándar.
Editar:
@AntonyHatchkins: la razón por la que no devuelve una función de generador es que no permitiría una operación rápida in
. Sí, in
funciona para funciones de generador (cuando las llamas). Es decir, se puede hacer esto:
def f():
for i in range(10):
yield i
5 in f() # True
Pero de acuerdo con la definición de in
, si el lado derecho es un generador, pitón pasará por todos los n
elementos del generador - que conduce a O(n)
complejidad del tiempo. No hay nada que puedas hacer al respecto porque ese es el único comportamiento significativo que es un generador arbitrario.
Por otro lado, en el caso de la vista de diccionario, puede implementar in
de la forma que desee, porque sabe más acerca de los datos que administra. Y, de hecho, in
se implementa con O(1)
complejidad utilizando una tabla hash. Puede comprobarlo ejecutando
>>> d = dict(zip(range(50000000), range(50000000)))
>>> 49999999 in d
True
>>> 49999999 in iter(d) # kinda how generator function would work
True
>>>
y darse cuenta de lo rápido que el primero in
se compara con el segundo in
.
Esta es una gran respuesta en stackoverflow: http://stackoverflow.com/questions/8957750/what-are-python-dictionary-view-objects – Exthen
Parece que la URL está muerto. – Borealis