2012-04-01 6 views
3

私は5秒ごとにMySQLデータベースを照会するPythonスクリプトを持っており、ヘルプデスクチケットの最新の3つのIDを収集しています。私は私のドライバとしてMySQLdbを使用しています。しかし、2つの配列が等しいかどうかをチェックするとき、私の "while"ループに問題があります。それらが等しくない場合は、「新しいチケットが到着しました」と印刷します。しかし、これは決して印刷されません!私のコードを参照してください。Python "While"ループロジックが間違っていますか?

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

さて、これは実行したときに、私は新しいチケットを作成し、出力は次のようになります。

[Previous_Last_Ticket, Prev_2nd_to_last, Prev_3rd] --> [Current_Last, 2nd-to-last, 3rd] 
:私の出力の形式は

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

番号の変更、さらに重要なことに、「新しいチケットが到着しました」ということに注意してください!これはIDarray_prevIDarrayとして同じ根底にあるリストを参照してくださいになり、Pythonで

IDarray_prev = IDarray 

答えて

7

問題は次の行です。一方の変更は両方とも同じものを指しているため、他方の変更は反映されます。

IDarray_prev = IDarray[:] 

[:]「はリスト全体のコピー」を意味Pythonのスライス表記です。、後で比較するために使用できるリストのコピーを作成しようとする

+0

美しい!それだった!ありがとうございました! – armani

+2

また、 'copy'モジュールで' copy'関数を使うこともできます。 –

+1

はい、これを解決する方法はたくさんあります。 'copy'を使うこともできますし、' list(IDarray) 'を使うこともできます。 –

2

Pythonは参照を使用しているので、最初の繰り返しの後では(基本的にIDarrayIDarray_prevに割り当てた後に両方が同じ参照を持つので、両方のリストを変更します。

を使用してIDarrayのコピーを割り当ててみてください。

+0

コードの書式設定を修正しました。インラインコードのバッククォートと、コードブロックの4つのインデントを注意してください。寄付いただきありがとうございます! –

+0

あなたの編集とフィードバックをありがとう。 – Mihai

関連する問題