GBlog -Everything is possible

Samedi 24 Décembre 2005

[Python] - Sudoku

Après que mat ai décidé de se mettre au Python, j'ai eu envie de vous faire part des événements Pytonesques de ma nuit.

J'ai programmé un solveur du jeu de Sudoku. Si l'exercice n'en est pas très difficile, il en reste cependant artistique. Je donne expres le code source en dehors de la page car je n'ai plus confiance dans les qualités de mon hightlighter de code pour ne rien pourrir. (TODO : Refaire ce blog de A à Z en passant par Python).

Ce travail m'a amené à une conclusion. Faire super attention quand on essaie d'utiliser des variables qui ne viennent pas du scope en cours.

Vous aller me demander ce que je raconte, on a toujours dit en progammation que les "globales" n'étaient pas une bonne chose. Cependant dans la philosophie Python c'est autre chose et l'on se sert en permanance des variables venant des scopes non locaux. (Je vous laisse utiliser l'import d'un module pour tester cela).

Alors que m'est-t-il arrivé, un truc stupide. J'ai essayé de faire quelque chose dans cette philosophie, cependant l'accès à une valeur venant d'un scope externe ne pose jamais de problème, Python remonte les espaces de noms pour trouver ce qui l'interesse.

Mais la modification ne se passe pas comme prévu. Or si vous tentez les deux il vous insulte gentiement. Dans le cas ou vous ne faites que la modification, Python se contente de modifier soit la valeur du scope local dans le cas d'une variable non mutable, soit celle du scope global pour une variable de type mutable.

J'ai été clair, non ?

def eggs():

   def spam(i):
       if i == 5:
           boolean = True
           booleanlist[0] = True

   boolean = False
   booleanlist = [False]
   for i in range(10):
       spam(i)
       print boolean,booleanlist[0]

eggs()

Ce qui est tout à fait normal. Dans le cas de boolean on change d'objet, donc on en reference un nouveau dans l'espace local. Dans le cas de booleanlist, il va tout d'abord chercher l'objet booleanlist qu'il ne trouve pas et ensuite modifie une de ces valeurs.

Pigé ? Pas grave. Amusez vous bien avec le sudoku.

[ 17 commentaires ]