2016-03-23 10 views
-2

Mein Code:Python-Fehler: "global name 'counter1' ist nicht definiert"

class Persistence: 
 
    num = 0 
 
    counter1 = 0 
 
    counter2 = 0 
 
    def __init__(self, num): 
 
     self.num = num 
 
    #num = input("Enter a non-negative number:: ") 
 
    if num < 0: 
 
     raise NameError("Negative") 
 
    #test else: 
 
     #print "ok!" 
 
    num_list = [] 
 
    def digitize(self, num): 
 
     num_list = [] 
 
     n = str(num) 
 
     for digit in n: 
 
      num_list.append(int(digit)) 
 
     return num_list 
 
    def sum_digits(self, num): 
 
     the_list = self.digitize(num) 
 
     the_sum = 0 
 
     for digit in the_list: 
 
      the_sum = the_sum + digit 
 
     return the_sum 
 
    def times_digits(self, num): 
 
     the_list = self.digitize(num) 
 
     the_product = 0 
 
     for digit in the_list: 
 
      the_product = the_product * digit 
 
     return the_product 
 
    def additive(self, num): 
 
     global counter1 
 
     sum1 = self.sum_digits(num) 
 
     list1 = [] 
 
     list1 = self.digitize(sum1) 
 
     if list1.__len__() > 1: 
 
      global counter1 
 
      counter1 = counter1 + 1 
 
      self.additive(sum1) 
 
     return sum1, counter1 
 
    def multiplicative(self, num): 
 
     global counter2 
 
     prod1 = self.times_digits(num) 
 
     list1 = [] 
 
     list1 = self.digitize(prod1) 
 
     if list1.__len__() > 1: 
 
      global counter1 
 
      counter2 = counter2 + 1 
 
      self.multiplicative(prod1) 
 
     return prod1, counter2 
 

 
c = Persistence(5) 
 
print c.additive(5) 
 
print c.multiplicative(5)

nicht sicher, warum ich immer diese Fehlermeldung? Es scheint mir, dass ich den globalen Variablenzähler1 definiert habe. Ich bekomme auch diesen Fehler für Zähler2, und die einzige Möglichkeit, den Fehler zu beheben, ist, indem Sie counter1 = 0 (oder eine andere Zahl) eine einzelne Zeile oberhalb der Return-Anweisung für die additive() -Methode einfügen. Hilfe würde sehr geschätzt werden !!

+0

Bitte geben Sie die vollständige Traceback in Ihrer Frage. – zondo

+3

Anstatt sie global zu machen, verwenden Sie 'Persistence.counter1', um auf sie zuzugreifen oder sie zu einem Instanzattribut zu machen. – L3viathan

+1

Sie haben es zu einem Klassenattribut anstelle einer globalen Variablen gemacht. Verwenden Sie '' Persistence.counter1' oder 'self.counter1' gemäß L3viathans Kommentar. Vermeiden Sie generell globale Variablen. – Evert

Antwort

0

Eine der Lösungen ist die Zähler aus der Klasse zu bewegen wie:

# global variables 
    num = 0 
    counter1 = 0 
    counter2 = 0 

    class Persistence: 
     .... 
     .... 

Lassen Sie den Rest Ihres Codes unverändert.

0

counter1 und counter2 sind definiert als Klasse zur Zeit Attribute, wenn Sie es auch bleiben wollen, greifen sie nur als classname. attrname:

class Persistence: 
    num = 0 
    counter1 = 0 
    counter2 = 0 
    def __init__(self, num): 
     self.num = num 
    #num = input("Enter a non-negative number:: ") 
    if num < 0: 
     raise NameError("Negative") 
    #test else: 
     #print "ok!" 
    num_list = [] 
    def digitize(self, num): 
     ... 
    def sum_digits(self, num): 
     ... 
    def times_digits(self, num): 
     ... 
    def additive(self, num): 
     sum1 = self.sum_digits(num) 
     list1 = [] 
     list1 = self.digitize(sum1) 
     if list1.__len__() > 1: 
      Persistence.counter1 = Persistence.counter1 + 1 
      self.additive(sum1) 
     return sum1, Persistence.counter1 
    def multiplicative(self, num): 
     prod1 = self.times_digits(num) 
     list1 = [] 
     list1 = self.digitize(prod1) 
     if list1.__len__() > 1: 
      Persistence.counter2 = Persistence.counter2 + 1 
      self.multiplicative(prod1) 
     return prod1, Persistence.counter2 

c = Persistence(5) 
print c.additive(5) 
print c.multiplicative(5) 
0

Der geeignete Weg, um dieses Problem zu lösen, werden die drei Klassenvariablen init Methode zu bewegen sein. Diese Variable wird assoziiert werden mit dem Objekt kann mit ‚Selbst‘ zugegriffen werden

class Persistence(object): 
    def __init__(self):  
     self.counter1 = 0 
     self.counter2 = 0   

    def digitize(self, num): 
     return [int(digit) for digit in str(num)] 

    def sum_digits(self, num): 
     return sum(self.digitize(num)) 

    def times_digits(self, num): 
     the_list = self.digitize(num) 
     the_product = 0 
     for digit in the_list: 
      the_product = the_product * digit 
     return the_product 

    def additive(self, num): 
     sum1 = self.sum_digits(num) 
     list1 = [] 
     list1 = self.digitize(sum1) 
     if len(list1) > 1: 
      self.counter1 += 1 
      self.additive(sum1) 
     return sum1, self.counter1 

    def multiplicative(self, num): 
     prod1 = self.times_digits(num) 
     list1 = [] 
     list1 = self.digitize(prod1) 
     if len(list1) > 1: 
      self.counter2 += 1 
      self.multiplicative(prod1) 
     return prod1, self.counter2 

c = Persistence() 
print c.additive(5) 
print c.multiplicative(5) 

Sie nicht in den Konstruktor num wenn Sie nicht tatsächlich verwendet wird.