2010-07-19 16 views
0

je la pièce suivante de code qui ne fonctionne pas la façon dont je pense à tout ...vraiment maladroit (apparemment simple) bug avec des comparaisons entières de python

current_frame = 15 # just for showcasing purposes 
g_ch = 7 

if (current_frame != int(row[0])) and (int(row[1]) != g_ch): 
       current_frame = int(row[0]) 
       print "curious=================================" 
       print current_frame 
       print row 
       print current_frame, " != ", int(row[0]), ", ", current_frame != int(row[0]) 
       print "========================================" 

qui imprime pour chaque cas particulier:

curious================================= 

15 

['15', '1', 'more data'] 15 != 15 , False 

======================================== 

Cela ne doit évidemment jamais entrer dans l'instruction if, car l'égalité est fausse. Pourquoi cela arrive-t-il?

edit: J'ai aussi essayé ceci avec! = Au lieu de 'n'est pas', et j'ai obtenu les mêmes résultats.

+2

L'égalité des valeurs ne doit pas être confondue avec l'identité. – recursive

+2

Puisque vous dites que cela se produit avec '! =' Et non ', omettez 'current_frame = int (row [0])' et montrez 'print repr (current_frame)' et 'print repr (row [0]) ' – unutbu

+0

belle prise unutbu. merci – ahhtwer

Répondre

5

Les comparaisons de valeurs sont effectuées avec l'opérateur !=, et non avec is not, qui compare l'identité de l'objet. En dehors de cela, je pense que c'est un problème d'indentation.

+0

Aurait dû mentionner que j'avais fait cela aussi, et obtenu le même résultat. – ahhtwer

1

En résumé, vous devez utiliser == et !=, et non is. is compare l'identité de l'objet, pas l'égalité.

0

Vous affectez current_frame = int(row[0]) à l'intérieur du if, ce qui modifie la valeur de l'expression booléenne.