2012-04-01 4 views
3

Ich habe ein Python-Skript, das alle 5 Sekunden eine MySQL-Datenbank abfragt und die letzten drei IDs für Helpdesk-Tickets sammelt. Ich verwende MySQLdb als meinen Treiber. Aber das Problem ist in meiner "while" -Schleife, wenn ich überprüfe, ob zwei Arrays gleich sind. Wenn sie NICHT gleich sind, drucke ich "Ein neues Ticket ist angekommen". Aber das druckt nie! Sehen Sie meinen Code:Python "While" Loop-Logik falsch?

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() 

nun diese lief, dann habe ich ein neues Ticket, sieht die Ausgabe wie folgt aus:

[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] 

Wo das Format meiner Ausgabe lautet:

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

Beachten Sie die Änderung der Zahlen und, noch wichtiger, das Fehlen von "Ein neues Ticket ist angekommen"!

Antwort

7

Das Problem ist die folgende Zeile ein:

IDarray_prev = IDarray 

In Python, das macht IDarray_prev zur gleichen zugrunde liegenden Liste als IDarray beziehen. Veränderungen in einem werden sich im anderen widerspiegeln, weil beide auf dasselbe hinweisen.

Um eine Kopie der Liste, die Sie später vergleichen können, versuchen Sie:

IDarray_prev = IDarray[:] 

Die [:] ist Python Slice-Notation, die „eine Kopie der ganzen Liste“ bedeutet.

+0

Schön! Das war's! Vielen Dank! – armani

+2

Oder Sie können die 'copy' Funktion im' copy' Modul verwenden. –

+1

Ja, es gibt viele Möglichkeiten, dies zu lösen. Sie können 'copy' verwenden, oder Sie können auch' list (IDarray) 'verwenden. –

2

Python arbeitet mit Referenzen, so dass Sie grundsätzlich beide Listen nach der ersten Iteration ändern (da beide die gleiche Referenz haben, nachdem Sie IDarray zu IDarray_prev zugewiesen haben).

Versuchen Sie, eine Kopie von IDarray mit IDArray_prev = list(IDarray) zuzuweisen.

+0

Die Formatierung des Codes wurde korrigiert. Beachten Sie die Backticks für Inline-Code und den Einzug mit vier Leerzeichen für Codeblöcke. Danke für deinen Beitrag! –

+0

Vielen Dank für Ihre Bearbeitung und Ihr Feedback. – Mihai