为什么全局变量的使用是未定义的



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

我做错了什么?

main.py:

from function.functions import *
loaded_tables = []
do_something()

函数.py:

def do_something():
global loaded_tables
loaded_tables.append('test')

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

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

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

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

这是修改后的函数.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. 避免全局变量,除非你真的真的需要。你可能想读一读为什么全局变量是邪恶的?。与其问如何使全局工作";,在这种情况下如何在没有全局变量的情况下重构它";。如果您的main模块包含data,而functions模块应该基于它进行一些操作,只需将参数传递给函数("做某事"所需的参数(,然后将结果返回到main。然后,数据上的所有突变都只在主模块上进行。这使得它更加模块化,并且在编写测试时很有帮助,因为该功能可以独立于loaded_tables进行测试
  3. 避免执行import *。也许这只是示例代码的简化,但最好还是显式导入您需要的内容。它可能会使调试变得困难,并使IDE难以发挥其智能性。请参阅为什么"import*"不好

相关内容

  • 没有找到相关文章

最新更新