3 votes

La logique de la boucle "While" de Python est erronée ?

J'ai un script Python script qui interroge une base de données MySQL toutes les 5 secondes, rassemblant les trois derniers identifiants des tickets du helpdesk. J'utilise MySQLdb comme pilote. Mais le problème se situe dans ma boucle "while", lorsque je vérifie si deux tableaux sont égaux. S'ils ne sont pas égaux, j'imprime "Un nouveau ticket est arrivé". Mais cela ne s'imprime jamais ! Voir mon code :

import MySQLdb
import time

# Connect
db = MySQLdb.connect(host="MySQL.example.com", user="example", passwd="example", db="helpdesk_db", port=4040)
cursor = db.cursor()

IDarray = ([0,0,0])
IDarray_prev = ([0,0,0])

cursor.execute("SELECT id FROM Tickets ORDER BY id DESC limit 3;")
numrows = int(cursor.rowcount)
for x in range(0,numrows):
   row = cursor.fetchone()
   for num in row:
      IDarray_prev[x] = int(num)
cursor.close()
db.commit()

while 1:
   cursor = db.cursor()
   cursor.execute("SELECT id FROM Tickets ORDER BY id DESC limit 3;")

   numrows = int(cursor.rowcount)
   for x in range(0,numrows):
      row = cursor.fetchone()
      for num in row:
         IDarray[x] = int(num)

   print IDarray_prev, " --> ", IDarray
   if(IDarray != IDarray_prev): 
      print "A new ticket has arrived."

   time.sleep(5)
   IDarray_prev = IDarray
   cursor.close()
   db.commit()

Lorsque j'ai créé un nouveau ticket, le résultat ressemble à ceci :

[11474, 11473, 11472]  -->  [11474, 11473, 11472]
[11474, 11473, 11472]  -->  [11474, 11473, 11472]
[11474, 11473, 11472]  -->  [11474, 11473, 11472]
[11474, 11473, 11472]  -->  [11474, 11473, 11472]
[11475, 11474, 11473]  -->  [11475, 11474, 11473]
[11475, 11474, 11473]  -->  [11475, 11474, 11473]
[11475, 11474, 11473]  -->  [11475, 11474, 11473]
[11475, 11474, 11473]  -->  [11475, 11474, 11473]
[11475, 11474, 11473]  -->  [11475, 11474, 11473]

Où le format de ma sortie est :

[Previous_Last_Ticket, Prev_2nd_to_last, Prev_3rd] --> [Current_Last, 2nd-to-last, 3rd]

Remarquez le changement de chiffres et, surtout, l'absence de "Un nouveau billet est arrivé" !

7voto

Greg Hewgill Points 356191

Le problème se situe à la ligne suivante :

IDarray_prev = IDarray

En Python, cela donne IDarray_prev se référer à la même liste sous-jacente comme IDarray . Les changements dans l'un se refléteront dans l'autre, car ils renvoient tous deux à la même chose.

Pour faire un copie de la liste que vous pouvez utiliser pour comparer plus tard, essayez :

IDarray_prev = IDarray[:]

Le [:] est une notation de tranche Python qui signifie "une copie de la liste entière".

2voto

Mihai Points 782

Python travaille avec des références, donc vous changez les deux listes après la première itération while (puisqu'elles ont toutes les deux la même référence après l'assignation de IDarray a IDarray_prev ).

Essayez d'assigner une copie de IDarray en utilisant IDArray_prev = list(IDarray) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X