2017-10-19 1 views
0

Ich habe beim Definieren einer Funktion in einer Klasse einen Fehler gemacht, ändert jedoch nicht, wie der Code während der Laufzeit funktioniert.Python-Klasse ändert globale Variable, ohne sie global zu deklarieren

Der Fehler, den ich machte, war eine globale Variable zu verwenden, wenn ich eine instanzierte Variable verwenden möchte.

Was war ich zu schreiben bedeutete:

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

Stattdessen schrieb ich:

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

jedoch die beabsichtigte Funktionalität (die Farbe einer LED) ändert sich nicht, egal Wenn es sich um die instanzierte Variable oder die globale Variable handelt. Die Funktion, die die Farbe tatsächlich in die LED schreibt, ist in einer anderen Klasse.

Ich dachte, das könnte nur passieren, wenn ich global <variable> einschließe? Ich habe sehr wenig Erfahrung mit Python, aber ich bin sicher, das war richtig.

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) 

Ich habe versucht, für diese Suche, aber ich kann nur Beiträge über die Menschen wollen, verwenden, um eine globale Variable in einer Klasse finden, ich versuche nicht speziell auf.

+0

Sie sind einfach falsch. Wenn in Python kein Name im lokalen Gültigkeitsbereich gefunden wird, werden Globals überprüft. –

Antwort

0

Offensichtlich hat Ihr Code zuvor eine globale map_data Variable erstellt, so dass der Code, den Sie zeigen, die map_data Variable nicht neu erstellt, sondern nur ein Element der vorhandenen Variable ändert. Die vorhandene Variable wird über die normale Namenssuche gefunden. In diesem Fall wird sie im globalen Kontext gefunden.

+0

So können die Elemente einer globalen Liste geändert werden, ohne die Liste selbst als global zu deklarieren? Das ist gut zu wissen, danke. – sgtgig

+0

Ja, für Listen und Wörterbücher oder jedes andere veränderbare Objekt. –

Verwandte Themen