2017-10-19 15 views
0

J'ai fait une erreur en définissant une fonction dans une classe, mais cela ne change pas la façon dont le code fonctionne pendant l'exécution. L'erreur que j'ai faite était d'utiliser une variable globale quand je veux utiliser une variable instanciée.La classe Python change la variable globale sans la déclarer globale

Ce que je voulais écrire était:

self._map_data[screen_pos_layer][y][x] = selected_material 

Au lieu de cela, je l'ai écrit:

map_data[screen_pos_layer][y][x] = selected_material 

Cependant, la fonctionnalité prévue (changer la couleur d'une LED) ne change pas, peu importe si c'est la variable instanciée ou la variable globale. La fonction qui écrit réellement la couleur dans la LED est dans une classe différente.

Je pensais que cela ne pouvait arriver que si j'incluais global <variable>? J'ai très peu d'expérience avec Python mais je suis sûr que c'était vrai.

class Tools(object): 

    def __init__(self, _map_data): 
     self._map_data = _map_data 

    def paint(self, event): 
     if selected_tool == select_paint and selected_color != -1: 
      for j in range(cursor_size_y): 
       for i in range(cursor_size_x): 
        y = screen_pos_y + cursor_pos_y + j 
        x = screen_pos_x + cursor_pos_x + i 

        map_data[screen_pos_layer][y][x] = selected_material 
     else: 
      return 

     moveCursor(event) 

tools = Tools(map_data) 

# this is a Tkinter object 
window.bind_all("<Control-Up>", tools.paint) 

J'ai essayé la recherche de cela, mais je ne pouvais trouver les messages au sujet des personnes qui souhaitent utiliser une variable globale dans une classe, je suis particulièrement essaie de ne pas.

+0

Vous vous méprenez simplement. En Python, si un nom n'est pas trouvé dans la portée locale, il vérifie les globales. –

Répondre

0

Évidemment, votre code a déjà créé une variable globale map_data, de sorte que le code que vous affichez n'est pas en train de recréer la variable map_data, il ne modifie qu'un élément de la variable existante. La variable existante est trouvée via la recherche de nom régulière, et dans ce cas, elle se trouve dans le contexte global.

+0

Donc les éléments d'une liste globale peuvent être changés sans déclarer la liste elle-même comme globale? C'est bon à savoir, merci. – sgtgig

+0

Oui, pour les listes et les dictionnaires, ou tout autre objet modifiable. –