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

2024-04-27 20:55:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力整理我的神经网络进化模拟器的代码,因为它已经长到了1000多行,而且很难阅读。这个过程的一部分涉及将代码块从主循环移动到它们自己的函数(事件处理、绘图到屏幕等)或它们自己的模块中。然而,我很难弄清楚如何处理全局变量。你知道吗

例如,我有一个名为“selected”的变量,它跟踪用户选择的特定神经网络生物。当用户单击一个新的生物时,我想在事件处理函数中更改这个变量的值;当该生物死亡时,我也想更改它的值,这发生在它自己函数的不同代码块中。你知道吗

我知道我可以用“global”关键字来做这件事,但我的印象是这样做通常是不好的做法。我也知道我可以将这些变量存储在一个单独的模块中并导入它们,但是当我处理30多个变量时,输入“module”_name.variable\u名称“每次我想修改它们似乎都是不必要的乏味。我还考虑将所有这些值存储在一个全局字典中,以便可以从函数中修改它们,但同样地,每次键入“dict\u name['var\u name']”似乎是不必要的。你知道吗

所以本质上我的问题是,在这种情况下,最好的做法是什么?是这些解决方案之一,还是有一个更干净的方法?在我花几个小时修改代码之前,我想确保我的思路是正确的。谢谢你的帮助!你知道吗


Tags: 模块函数代码用户name绘图屏幕过程
1条回答
网友
1楼 · 发布于 2024-04-27 20:55:24

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)都建议使用completion(比dictionary好得多,在dictionary中不能使用completion)

# 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变量。你知道吗

相关问题 更多 >