Para cada contenedor Python C, la expectativa es que
for item in C:
assert item in C
pasará bien, ¿no le parecería sorprendente si una sensación dein
(la cláusula loop) tuviera un significado completamente diferente del otro (la verificación de presencia)? ¡Seguro que lo haría! Naturalmente funciona de esa manera para listas, conjuntos, tuplas, ...
Entonces, cuando se C
trata de un diccionario, si se in
produjeran tuplas clave / valor en un for
bucle, entonces, por el principio de menor asombro, in
también tendría que tomar una tupla como su operando de la izquierda en la verificación de contención.
¿Qué tan útil sería eso? De hecho, es bastante inútil, básicamente haciendo if (key, value) in C
un sinónimo de if C.get(key) == value
, que es un control que creo que podría haber realizado, o quería realizar, 100 veces más raramente de lo que if k in C
realmente significa , verificando la presencia de la clave solamente e ignorando por completo el valor.
Por otro lado, querer hacer un bucle solo en las teclas es bastante común, por ejemplo:
for k in thedict:
thedict[k] += 1
tener el valor también no ayudaría particularmente:
for k, v in thedict.items():
thedict[k] = v + 1
en realidad algo menos claro y menos conciso. (Tenga en cuenta que esa items
era la ortografía original de los métodos "adecuados" para usar para obtener pares clave / valor: desafortunadamente eso fue en los días en que tales accesores devolvieron listas completas, por lo que para admitir "simplemente iterar" se tuvo que introducir una ortografía alternativa , y iteritems
lo fue: en Python 3, donde las restricciones de compatibilidad con versiones anteriores de Python se debilitaron mucho, se volvió de items
nuevo).
x in foo
solo sii
en algún momentofor i in foo
asume el valor dex
, diría que sería una gran inconsistencia.