2016-03-22 14 views
0

definiert Ich habe diesen Code bekam:Python verschachtelt Wörterbuch Verständnis in statischen Klassenbereich: Variable nicht

class Chars: 
    char_to_number = { 
     'a': ['1'], 
     'b': ['2'], 
     'c': ['3', '6'], 
     'd': ['4', '5'], 
    } 

    number_to_char = { 
     number: char 
     for char in char_to_number 
     for number in char_to_number[char] 
    } 

Nun dieser Code gibt einen Fehler als solche: name 'char_to_number' is not defined

Jetzt ist es wie Python sieht könnte das verschachtelte Wörterbuchverständnis nicht analysieren. Es sieht so aus, als ob der innere Bereich nicht mit dem äußeren Bereich aktualisiert wurde, der die Variable char_to_number definiert hat.

Ich habe diesen Code mit dieser Implementierung gelöst:

class Chars: 
    char_to_number = { 
     'a': ['1'], 
     'b': ['2'], 
     'c': ['3', '6'], 
     'd': ['4', '5'], 
    } 

    number_to_char = { 
     number: char 
     for char, optional_numbers in char_to_number.items() 
     for number in optional_numbers 
    } 

hier nicht die char_to_number Variable in der inneren Schleife ich bin, und Python gelang es diesen Code zu analysieren.

Natürlich geschieht das alles im globalen Umfang der Klasse. Im globalen Python Umfang, ist es nicht passieren:

char_to_number = { 
    'a': ['1'], 
    'b': ['2'], 
    'c': ['3', '6'], 
    'd': ['4', '5'], 
} 

number_to_char = { 
    number: char 
    for char in char_to_number 
    for number in char_to_number[char] 
} 

Hat jemand eine Ahnung davon?

Antwort

0

Ich glaube, es ist, weil es keine permanente Definition Ihrer Objekte gibt, wie Sie in einem globalen Bereich haben. Wenn Sie Ihre Variablen im Rahmen Ihrer Klasse dauerhaft machen, sollte das Problem gelöst werden:

class Chars: 
    def __init__(self): 
     self.char_to_number = { 
      'a': ['1'], 
      'b': ['2'], 
      'c': ['3', '6'], 
      'd': ['4', '5'], 
     } 

     self.number_to_char = { 
      number: char 
      for char in self.char_to_number 
      for number in self.char_to_number[char] 
     } 

c = Chars() 
+0

dieser ist offensichtlich, und es ist ähnlich zu meinem 3. Beispiel. Python analysiert anders, wenn es um den globalen Gültigkeitsbereich der Klasse geht. –

+0

Ich kann nur vermuten, dass Python die verschachtelten Schleifen in eine lokale Domäne analysiert. Nicht die erste "für char in char_to_number", wo Sie Argumente geben. Aber in der zweiten, "Nummer inchar_to_number [char]", wo es lokal mit dem ersten passiert. Also meine Vermutung ist, dass Sie tatsächlich etwas wie >> LoopFunction() {char; LoopFunction2(); }, daher wird das lokale Argument "char_to_number" nicht erkannt ("char" sollte kein Problem haben). Die Lösung besteht darin, Global entweder in Global oder Class zu machen. Es ist hypothetisch, nie den Quellcode für Verständnisschleifen gesehen. – armatita