2016-03-23 1 views
-2

Мой код:Python ошибка: "глобальное имя 'счетчик1' не определен"

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)

Не знаю, почему я получаю эту ошибку? Мне кажется, что я определил глобальную переменную counter1. Я также получаю эту ошибку для counter2, и единственный способ, которым я смог разрешить ошибку, - вставить counter1 = 0 (или любое другое число) одну строку над оператором return для метода additive(). Помощь была бы очень признательна!

+0

Просьба предоставить полный ответ в вашем вопросе. – zondo

+3

Вместо того чтобы сделать их глобальными, используйте 'Persistence.counter1' для доступа к нему или сделайте его атрибутом экземпляра. – L3viathan

+1

Вы сделали это атрибутом класса вместо глобальной переменной. Согласно комментарию L3viathan, используйте 'Persistence.counter1' или' self.counter1'. Как правило, во избежание глобальных переменных. – Evert

ответ

0

Одно из решений состоит в перемещении счетчиков из класса, как:

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

    class Persistence: 
     .... 
     .... 

Оставьте остальную часть вашего кода неизмененной.

0

counter1 и counter2 определяются как атрибуты класса в настоящее время, если вы хотите сохранить его таким образом, только доступ к ним, как 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

Соответствующий способ решения этого вопроса будет двигаться переменные 3 класса в инициализации метода. Эти переменные станут связаны с объектом можно получить с помощью «я»

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) 

Вы не NUM в конструкторе, если вы на самом деле не использовать его.