【问题标题】:How should I modify global variables from within a function?我应该如何从函数中修改全局变量?
【发布时间】:2019-06-22 19:48:04
【问题描述】:

我一直在尝试清理我正在开发的神经网络进化模拟器的代码,因为它已经增长到 1000 多行并且非常难以阅读。该过程的一部分涉及将代码块从主循环移动到它们自己的函数(事件处理、绘制到屏幕等)或它们自己的模块中。但是,我无法弄清楚如何处理全局变量。

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

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

所以基本上我的问题是,在这种情况下,最佳做法是什么?它是这些解决方案之一,还是有更清洁的方法?在花费数小时彻底检查代码之前,我想确保自己走在正确的轨道上。感谢您的帮助!

【问题讨论】:

  • 全局变量是一种不好的做法,而不是使用 global 关键字。如果您使用全局变量,请使用global 在函数内修改它们。
  • 全局变量被frounded的原因和这么小的程序没什么关系,不要心疼
  • 所有全局变量都与用户交互有关吗?
  • 如果你的值真的是全局的(也就是单例),那么请随意使用 global.调试起来稍微困难一些,但应该没问题。

标签: python scope structure readability


【解决方案1】:

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 变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多