如何在函数中修改全局变量?

时间:2019-06-22 19:48:04

标签: python scope structure readability

我一直在尝试为正在使用的神经网络进化模拟器清理代码,因为它已经增长到1000多个行,而且很难阅读。该过程的一部分涉及将代码块从主循环移动到它们自己的功能(事件处理,绘制到屏幕等)或他们自己的模块中。但是,我在弄清楚如何处理全局变量时遇到了麻烦。

作为一个例子,我有一个名为“ selected”的变量,它跟踪用户选择的特定神经网络生物。当用户单击新生物时,我想在事件处理函数中更改此变量的值;我还想在生物死亡时更改其值,这发生在其自身功能的不同代码块中。

我知道可以使用“全局”关键字来执行此操作,但我的印象是这样做通常是不明智的做法。我也知道我可以将这些变量存储在单独的模块中并导入它们,但是当我处理30多个变量时,每次我想修改它们时都键入“ module_name.variable_name”似乎不必要地乏味。我还考虑将所有这些值存储在全局字典中,以便可以在函数中对其进行修改,但是再次,每次键入“ dict_name ['var_name']”似乎都是不必要的。

因此,本质上我的问题是,在这种情况下,最佳实践是什么?是这些解决方案之一,还是有一种更清洁的方法?我想确保自己在正确的轨道上,然后再花费数小时检查代码。谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

30个全局变量只是一个很大的禁忌。在某些时候,您会忘记global语句,并且会创建一个局部变量,并将花费数小时来调试代码。

您可以改为构建一个单例对象

代替:

a = 12
b = 33
c = "foo"

def run():
   global a
   if a == 34:
      # do something
      a += 1

您可以创建一个包含所有变量作为成员的大型包装类:

class Program:
   def __init__(self):
     self.a = 12
     self.b = 33
     self.c = "foo"

现在您可以使用self前缀访问所有变量。它可能很乏味,但至少要简短一些,大多数优秀的IDE(pycharm,pyscripter,eclipse)都建议使用完成功能(比字典中要完成的情况要好得多)

# let's say it's the main method
def run(self):
   if self.a == 34:
      # do something
      self.a += 1

现在:

o = Program()
o.run()
print(o.a)  # without __ prefix, your data is visible from the outside

因此,使用一个对象不是为了继承,多态等,而只是使用“ self.”前缀定义“全局”上下文并在实例内部工作,并告别global变量。 / p>