我应该如何从函数内修改全局变量?
How should I modify global variables from within a function?
我一直在尝试清理我正在研究的神经网络进化模拟器的代码,因为它已经超过 1000 行并且很难阅读。该过程的一部分涉及将代码块从主循环移动到它们自己的函数(事件处理、绘制到屏幕等)或它们自己的模块中。但是,我无法弄清楚如何处理全局变量。
例如,我有一个名为 "selected" 的变量,用于跟踪用户选择的特定神经网络生物。当用户点击一个新生物时,我想在事件处理函数中改变这个变量的值;我还想在生物死亡时更改它的值,这发生在它自己函数的不同代码块中。
我知道我可以使用 "global" 关键字来执行此操作,但我的印象是这样做通常不是很好的做法。我也知道我可以将这些变量存储在一个单独的模块中并导入它们,但是当我处理 30 多个变量时,每次我想修改它们时输入 "module_name.variable_name" 似乎不必要地乏味。我也在考虑将所有这些值存储在一个全局字典中,这样我就可以在函数中修改它们,但同样,每次输入 "dict_name['var_name']" 似乎都是不必要的。
所以基本上我的问题是,在这种情况下最好的做法是什么?它是这些解决方案之一,还是有更清洁的方法?在我花几个小时彻底修改我的代码之前,我想确保我走在正确的轨道上。感谢您的帮助!
30个全局变量就是一个大no-no。有时您会忘记 global
语句,您将创建一个局部变量并花费数小时来调试您的代码。
您可以改为构建单例对象
而不是:
a = 12
b = 33
c = "foo"
def run():
global a
if a == 34:
# do something
a += 1
您可以创建一个大包装 class,将所有变量作为成员:
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
所以使用对象不是为了继承、多态性等,而是为了定义 "global" 上下文并在实例内部工作,带有 self.
前缀,并告别 global
变量。
我一直在尝试清理我正在研究的神经网络进化模拟器的代码,因为它已经超过 1000 行并且很难阅读。该过程的一部分涉及将代码块从主循环移动到它们自己的函数(事件处理、绘制到屏幕等)或它们自己的模块中。但是,我无法弄清楚如何处理全局变量。
例如,我有一个名为 "selected" 的变量,用于跟踪用户选择的特定神经网络生物。当用户点击一个新生物时,我想在事件处理函数中改变这个变量的值;我还想在生物死亡时更改它的值,这发生在它自己函数的不同代码块中。
我知道我可以使用 "global" 关键字来执行此操作,但我的印象是这样做通常不是很好的做法。我也知道我可以将这些变量存储在一个单独的模块中并导入它们,但是当我处理 30 多个变量时,每次我想修改它们时输入 "module_name.variable_name" 似乎不必要地乏味。我也在考虑将所有这些值存储在一个全局字典中,这样我就可以在函数中修改它们,但同样,每次输入 "dict_name['var_name']" 似乎都是不必要的。
所以基本上我的问题是,在这种情况下最好的做法是什么?它是这些解决方案之一,还是有更清洁的方法?在我花几个小时彻底修改我的代码之前,我想确保我走在正确的轨道上。感谢您的帮助!
30个全局变量就是一个大no-no。有时您会忘记 global
语句,您将创建一个局部变量并花费数小时来调试您的代码。
您可以改为构建单例对象
而不是:
a = 12
b = 33
c = "foo"
def run():
global a
if a == 34:
# do something
a += 1
您可以创建一个大包装 class,将所有变量作为成员:
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
所以使用对象不是为了继承、多态性等,而是为了定义 "global" 上下文并在实例内部工作,带有 self.
前缀,并告别 global
变量。