Python类正在更改全局变量而未声明全局

Python类正在更改全局变量而未声明全局

问题描述:

我在定义类中的函数时发生了错误,但它并未改变代码在运行时的运行方式。Python类正在更改全局变量而未声明全局

我犯的错误是使用全局变量,当我的意思是使用实例化变量。

我的意思写的是:

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

相反,我写道:

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

然而,预期功能(改变LED的颜色)不会改变,不管如果它是实例变量或全局变量。实际将颜色写入LED的功能处于不同的级别。

我以为只有包含global <variable>才会发生?我对Python很少有经验,但我确信这是真的。

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) 

我试过寻找这个,但我只能找到想要在一个类中使用全局变量的人的帖子,我特别想尽量不要。

+0

你简直是错了。在Python中,如果在本地作用域中找不到名称,它将检查全局变量。 –

很明显,您的代码之前创建了一个全局变量map_data,因此您显示的代码不会重新创建map_data变量,它只是修改现有变量的一个元素。现有的变量是通过常规名称查找找到的,所以在这种情况下,它可以在全局上下文中找到。

+0

因此,全局列表的元素可以在没有声明列表本身为全局的情况下进行更改?很高兴知道,谢谢。 – sgtgig

+0

是的,用于列表和字典,或任何其他可变对象。 –