Eh bien, ça dit aussi :
Les boucles imbriquées tournent comme un odomètre avec l'élément le plus à droite avançant à chaque itération. Ce modèle crée un ordre lexicographique lexicographique, de sorte que si les itérables de l'entrée sont triés, les tuples sont émis dans l'ordre trié.
C'est à peu près comme cela que cela fonctionne dans l'implémentation ( Modules/itertoolsmodule.c
)
Voici l'objet d'état :
typedef struct {
PyObject_HEAD
PyObject *pools; /* tuple of pool tuples */
Py_ssize_t *indices; /* one index per pool */
PyObject *result; /* most recently returned result tuple */
int stopped; /* set to 1 when the product iterator is exhausted */
} productobject;
Et l'élément suivant est renvoyé par la fonction product_next
qui utilise cet état et l'algorithme décrit dans la citation pour générer l'état suivant. Voir cette réponse pour comprendre les besoins en mémoire.
Pour une formation générale, vous pouvez lire comment créer des générateurs avec état à partir d'extensions C aquí .