为什么使用全局变量给出undefined?

Why is the use of global variables giving undefined?

我似乎无法弄清楚我的变量做错了什么。基本上我的 main.py 中有一个变量,我需要在我的 function.py 中的函数中进行调整。但是我收到一个错误,指出变量尚未定义。

我做错了什么?

main.py:

from function.functions import *

loaded_tables = []

do_something()

functions.py:

def do_something():

  global loaded_tables

  loaded_tables.append('test')

Python 中的全局变量不是真正的全局变量,它们是 module-scoped。这意味着您可以从模块 main 中的任何函数访问 loaded_tables。如果你想在任何其他模块中使用它,你必须导入它。在你的情况下,这会给你一个循环导入,因此无法正常工作。

正如@klaus-d 在他们的评论中所建议的那样,避免使用全局变量并简单地将参数传递给函数是一种很好的做法。

如果你真的想使用全局变量,你可以在一个单独的模块中定义它们(例如 app_globals.py)并在你需要访问它们时从那里导入它们。

让我们尝试解决问题,同时避免一些不良做法。

这是修改后的 functions.py:

def do_something(params):
  # computing something based on params..
  return 'test'

这是修改后的 main.py:

from functions import do_something

loaded_tables = []
print(loaded_tables)

result = do_something(123)
loaded_tables.append(result)
print(loaded_tables)

运行它:

$ python main.py
[]
['test']

变化:

  1. 中所述,loaded_tables 名称仅适用于 main.py 模块,不适用于 functions.py。说 global 不会告诉 Python 在 main 模块(或其他文件)中查找它。
  2. 避免全局变量,除非你真的真的需要。您可能想阅读 Why are global variables evil?。在这种情况下,与其问“如何使全局变量工作”,不如想想“如何在没有全局变量的情况下重构它”。如果你的 main 模块包含 data,并且 functions 模块应该基于它做一些操作,只需将参数传递给函数(“做某事”所需的参数),然后 return 结果到 main。然后,所有对数据的修改都只在主模块上完成。这使得它更加模块化并且在编写测试时很有帮助,因为该功能可以独立于 loaded_tables.
  3. 进行测试
  4. 避免做 import *。也许这只是示例代码的简化,但仍然最好显式导入您需要的内容。它会使调试和 IDE 的智能感知工作变得困难。参见 Why is “import *” bad?