2016-03-23 23 views
-2

私のコードは:Pythonのエラー: "グローバル名 'カウンタ' が定義されていません"

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(または他の数字)をadd()メソッドのreturn文の上に1行挿入することです。ヘルプは大いに感謝されるだろう!

+0

質問に完全なトレースバックを入力してください。 – zondo

+3

グローバルにするのではなく、 'Persistence.counter1'を使ってアクセスするか、インスタンス属性にします。 – L3viathan

+1

グローバル変数ではなくクラス属性にしました。 L3viathanのコメントによれば、 'Persistence.counter1'または' self.counter1'を使います。とにかくグローバル変数は避けてください。 – Evert

答えて

0

解決策の一つは、のようなクラスの外にカウンターを移動することです:

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

    class Persistence: 
     .... 
     .... 

は、修飾されていない、あなたのコードの残りの部分を残します。クラスは現在、属性として、あなただけのclassnameとしてそれらにアクセスする、そのように維持したい場合は

0

counter1counter2は、定義されています。 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

のinitメソッドに3クラス変数を移動することで、この問題を解決するための適切な方法。これらの変数は、オブジェクトが、あなたが実際にそれを使用していない場合は、コンストラクタでnumはない「自己」

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) 

を使用してアクセスすることが可能に関連付けられているになります。

関連する問題