2017-05-26 4 views
0

J'essaie de mettre à jour une variable de compteur d'un chaque fois qu'une certaine valeur reste la même.La variable Python dans l'espace de noms global n'est pas mise à jour par affectation augmentée dans la fonction dans l'espace de noms de classe

Le principal c'est conditionnel:

streak = 0 
entryno_counter = 1 

class OtherDataGet: 
streak_type = 3 
uod_state = 3 

    @staticmethod 
    def uod(): 
     global streak 
     if entryno_counter == 1: 
      pass 
     else: 
      if values[1] > values_cache[1]: # If value went up 
       if OtherDataGet.uod_state == 1 or 2: # If it was previously down or same 
        OtherDataGet.uod_state = 0 # Set state to up 
        streak = 0 # Reset streak 
        OtherDataGet.streak_type = 0 # Set streak type to up 
       elif OtherDataGet.uod_state == 0: # If last state was up 
        streak += 1 # Add one to streak counter 
       return 0 
      elif values[1] < values_cache[1]: 
       if OtherDataGet.uod_state == 0 or 2: 
        OtherDataGet.uod_state = 1 
        streak = 0 
        OtherDataGet.streak_type = 1 
       elif OtherDataGet.uod_state == 1: 
        streak += 1 
       return 1 
      elif values[1] == values_cache[1]: 
       if OtherDataGet.uod_state == 0 or 1: 
        OtherDataGet.uod_state = 2 
        streak = 0 
        OtherDataGet.streak_type = 2 
       elif OtherDataGet.uod_state == 2: 
        streak += 1 
       return 2 

La variable qui est mise à jour est dans l'espace de noms global, et est accessible partout, donc il devrait y avoir aucun problème à le mettre à jour. Par exemple, lorsqu'un 2 est retourné la première fois, le compteur de stries est mis à 0, le deuxième temps a 2 est retourné, il doit être mis à 1, le troisième temps a 2 est retourné, il doit être un 3, etc.

1,125519,0,182701,4,404, 0,1
2,125519,2,182702,4,404, 2,1
3,125518,1,182703 , 4,404, 1,1
4,125519,0,182704,4,404, 0,1
5,125519,2,182705,4,404, 2,1
6,125519,2,182706,4,404, 2,1
7,125519,2,182706,4,404, 2,1
8,125519,2,182707,4,404, 2,1
9,125517,1,182708,4,404, 1,1
10,125518,0,182709,4,404, 0, 1
11,125517,1,182710,4,404, 1,1

Ceci est la donnée de sortie, tout ce que vous devez regarder est les deux dernières colonnes. L'avant-dernier est la valeur retournée de OtherDataGet.uod, et la dernière devrait être streak. Si vous regardez les lignes 5-8, il y a une série de 2, et la dernière valeur sur la ligne devrait être 1, 2, 3, 4 respectivement, mais elle reste 1 même quand elle devrait être remise à 0.

+0

double possible de [Utilisation des variables globales dans une fonction autre que celui qui les a créés] (https://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them) –

Répondre

0

Lorsque vous essayez d'affecter à une variable globale dans une fonction, elle crée une variable locale à la place. Pour éviter cela, utilisez le mot-clé global dans votre fonction.

Dans ce cas, ce serait:

def uod(): 
    global streak, entryno_counter 

Et le reste comme d'habitude. .

+0

Mon mauvais, il y avait une erreur dans la façon dont le code a été copié, il est déclaré global en haut de la fonction et ne fonctionne toujours pas. –

0

simplement déclarer la variable globalement à l'intérieur d'une fonction que vous souhaitez utiliser dans EG:

def uod(): 
    global streak